45

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

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

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

このエラーを生成するmakefileからのアクションは、次の行です。

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)
4

2 に答える 2

79

Linuxでは、CMakeは、boost_filesystemがboost_systemに対してリンクされていると考えています。明らかに、Macでは明示的に伝える必要があります。

find_package(Boost COMPONENTS system filesystem REQUIRED)
#...
target_link_libraries(mytarget 
  ${Boost_FILESYSTEM_LIBRARY}
  ${Boost_SYSTEM_LIBRARY}
)
于 2009-06-30T20:02:37.627 に答える
10

これは投稿された質問に対する「回答」ではなく、私の Ubuntu ボックスに関する観察です。

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

find_package(Boost COMPONENTS regex system filesystem REQUIRED)

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

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

または、CMake 3.15 以降のコンポーネント ターゲットを使用します。

target_link_libraries(binary PUBLIC
    Boost::regex
    Boost::system 
    Boost::filesystem
    )

これは、Maik の言うことに従いますが、Mac だけではありません。

于 2012-09-05T16:10:08.963 に答える