web-dev-qa-db-ja.com

cmakeを使用してboost.systemにリンクする方法

私はcmakeで生成されたmakefileを使用して、boostファイルシステムライブラリに依存するc ++ファイルをコンパイルします。

リンクプロセス中に次のエラーが発生します。

未定義のシンボル:
 "boost :: system :: get_generic_category()"、以下から参照:
 __static_initialization_and_destruction_0(int、int)in FaceRecognizer.cpp.o 
 __static_initialization_and_destruction_0(int、int)in FaceRecognizer.cpp.o 
 __static_initialization_and_destruction_0(int、int)in FaceRecognizer.cpp.o 
 "boost :: system :: get_system_category()"、参照元:
 FaceRecognizer.cpp.o 
の__static_initialization_and_destruction_0(int、int)
 FaceRecognizer.cpp.o 
 ldの__static_initialization_and_destruction_0(int、int)ld:シンボルが見つかりません] collect2:ldが1の終了ステータスを返しました
 make [2]:*** [src/ImageMarker]エラー1 

このエラーを生成するメイクファイルからのアクションは次の行です。

 cd/Users/janusz/Documents/workspace/ImageMarker/Debug/src &&/opt/local/bin/cmake -E cmake_link_script CMakeFiles/ImageMarker.dir/link.txt --verbose = 1 
/usr/bin/c ++ -O3 -Wall -Wno-deprecated -g -verbose -Wl、-search_paths_first -headerpad_max_install_names -fPIC CMakeFiles/ImageMarker.dir/ImageMarker.cpp.o CMakeFiles/ImageMarker.dir/Image.cpp.o CMakeFiles/ImageMarker.dir/utils.cpp.o CMakeFiles/ImageMarker.dir/XMLWriter.cpp.o CMakeFiles/ImageMarker.dir/FaceRecognizer.cpp.o -o ImageMarker -L/opt/local/lib ../libTinyXml.a /opt/local/lib/libboost_filesystem-mt.dylib 

いくつかのグーグルで、boost.systemライブラリにリンクするか、boost.systemライブラリに応じてプロジェクトを作成する必要があるため、このエラーは、boostファイルシステムライブラリを備えたMacでは一般的であるように見えました。

ライブラリパスをハードコーディングせずに、ライブラリにリンクするようにcmakeを強制するにはどうすればよいですか?

ここでotoolの結果:

otool -L /opt/local/lib/libboost_filesystem-mt.dylib
 /opt/local/lib/libboost_filesystem-mt.dylib:
 /opt/local/lib/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0)  
 /opt/local/lib/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0)   
 /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
36
Janusz

Linuxでは、CMakeはboost_filesystemがboost_systemに対してリンクされていることを示しています。明らかにあなたはそれをMacで明示的に言わなければなりません:

find_package(Boost COMPONENTS system filesystem REQUIRED)
#...
target_link_libraries(mytarget 
  ${Boost_FILESYSTEM_LIBRARY}
  ${Boost_SYSTEM_LIBRARY}
)
71
Maik Beckmann

これは投稿された質問に対する「答え」ではありませんが、私のUbuntuボックスでの観察です。

Boostライブラリを使用するには、次のように明示的に記述する必要があります。

find_package(Boost COMPONENTS regex system filesystem REQUIRED)

さらに、次のようにリンクする必要があります。

target_link_libraries(binary
  ${Boost_FILESYSTEM_LIBRARY}
  ${Boost_SYSTEM_LIBRARY}
  ${Boost_REGEX_LIBRARY}
)

次の方法は、少なくとも私にとってはうまくいきませんでした:

target_link_libraries(binary regex system filesystem)

これは、Macだけでなく、Maikの発言にも従います。

9
galactica