2017-12-14 22 views
0

私はOpenMPを使いたいと思う現在のMacベースの趣味プロジェクトに取り組んでいます。私の場合は実装が比較的簡単です。いくつかのオンライン読書の後、gccとclangの両方が現在のバージョンで-fopenmpでコンパイルできることが分かりました。 Xcodeに含まれているデフォルトのmacOSコンパイラは、この機能を削除しています。だから、私はgcc 7とclang 5の両方を私のmacOSにインストールしました。私のプロジェクトはCMakeを介してビルドされているので、私は次のmakefileを書いています。このバージョンでMacOS上のデフォルト以外のコンパイラ(GCCまたはVanilla-Clang)High Sierraリンクの問題

cmake_minimum_required(VERSION 3.0) 

project(Project C CXX) 

#SET(CMAKE_C_COMPILER /usr/local/bin/gcc-7) 
#SET(CMAKE_CXX_COMPILER /usr/local/bin/gcc-7) 

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2 -mavx2 -march=haswell -flto=thin -g0") 
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread") 

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
FIND_PACKAGE(Boost 1.65 COMPONENTS filesystem system thread atomic chrono regex) 
FIND_PACKAGE(OpenCV REQUIRED core imgproc imgcodecs calib3d) 

set(HDF5_USE_STATIC_LIBRARIES ON) 
set(HDF5_ROOT /usr/local/HDF_GROUP/HDF5/1.10.0/) 
FIND_PACKAGE(HDF5 REQUIRED) 

include_directories(${CMAKE_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${HDF5_INCLUDE_DIRS}) 

add_executable(Project /path/to/many/files..) 

TARGET_LINK_LIBRARIES(Project ${Boost_LIBRARIES}) 
TARGET_LINK_LIBRARIES(Project ${OpenCV_LIBS}) 
TARGET_LINK_LIBRARIES(Project ${HDF5_LIBRARIES}) 

CMAKE_CXX_COMPILERが無効に設定すると、コードは、リンクをコンパイルし、滞りなく実行されます。まったく同じ変更をせずにgccやvanilla-clangを使用するようにCMakeを設定すると、コンパイルは問題なく終了しますが、リンクは失敗します。したがって

"std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: 
     _main in main.cpp.o 

のようないくつかのOpenCVのシンボルに、ほとんどのlibC++のものに至るまで行方不明のシンボルのリンカ・レポートの数百人は、私は明らかに根本的な何かが欠けています。 vanilla-clangを使って、-L/usr/local/opt/llvm/libを追加して、clangに付属のlibsにリンカーを向けるようにしました。残念ながら、これは何も変わりませんでした。

私はこの問題について何かヒントをいただきたいと思います。

答えて

1

gccコンパイラドライバを使用してコンパイラを 'gcc'から 'gcc'に変更すると、g ++は自動的にgccが標準のC++ライブラリを取り込みます。または、-lstdC++を追加すると、必要ですが、g ++をコンパイラドライバとして使用する方が簡単です。

+0

ヒントをお寄せいただきありがとうございます。これは間違いなくシンボルの数を減らします。興味深いことに、欠けているシンボルは、 "std :: __ 1 :: basic_string 、std :: __ 1 :: allocator :: :: basic_string()"のような基本的なC++機能を参照しています。そういうわけではありませんが、それは常にブーストかOpenCVを参照しています。両方のlibをgccで再コンパイルする必要がありますか? – GruenSein

+0

アップデート:これはLLVM/clang 5.0で機能しました。 GCCは、以前はAppleの仲間によって編集された図書館とまだ戦っているようだ。とにかく、これは大いに役立ちます! – GruenSein

関連する問題