私は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)
Linuxでは、CMakeはboost_filesystemがboost_systemに対してリンクされていることを示しています。明らかにあなたはそれをMacで明示的に言わなければなりません:
find_package(Boost COMPONENTS system filesystem REQUIRED)
#...
target_link_libraries(mytarget
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
)
これは投稿された質問に対する「答え」ではありませんが、私の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の発言にも従います。