3

MacPorts によってインストールされた Boost を使用して、Mac で Boost.Test を使用する小さなプログラムを作成するのに問題があります。/opt/local/lib/

これが私の最小限のソースファイルですtest.cpp

#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(test1) {
}

そして私のCMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project (test)
find_package(Boost COMPONENTS unit_test_framework REQUIRED)
add_executable(test test.cpp)

からの抜粋make VERBOSE=1:

[100%] Building CXX object CMakeFiles/test.dir/test.cpp.o
g++ -o CMakeFiles/test.dir/test.cpp.o -c /Users/exclipy/Code/cpp/inline_variant/question/test.cpp
Linking CXX executable test
"/Applications/CMake 2.8-5.app/Contents/bin/cmake" -E cmake_link_script CMakeFiles/test.dir/link.txt --verbose=1
g++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/test.dir/test.cpp.o-o test
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
  "vtable for boost::unit_test::unit_test_log_t", referenced from:
      boost::unit_test::unit_test_log_t::unit_test_log_t() in test.cpp.o
      boost::unit_test::unit_test_log_t::~unit_test_log_t() in test.cpp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.

ご覧のとおり、Boost ライブラリへのリンク方法がわかりません。だから私は CMakeLists.txt に追加しようとします:

target_link_libraries(test boost_unit_test_framework)

しかし、私はただ得ます:

g++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/test.dir/test.cpp.o-o test -lboost_unit_test_framework 
ld: library not found for -lboost_unit_test_framework

多くの試行錯誤の結果、これを手動で実行するとうまくいくことがわかりました。

$ g++ test.cpp -L/opt/local/lib -lboost_unit_test_framework -DBOOST_TEST_DYN_LINK

しかし、何時間もいじった後、CMake からビルドすることができません。動的にリンクするか静的にリンクするかは気にしません。ただ機能させたいだけです。

4

3 に答える 3

5

ブースト ライブラリの場所を CMake に指示する必要があります ( -L/opt/local/libg++ 行内)。次の行を追加することで、これを実現できます (問題がなければfind_package)。

link_directories ( ${Boost_LIBRARY_DIRS} )

前にadd_executable

もう 1 つの方法は、UTF の単一ヘッダー バリアントを使用することです。このバリアントは非常に単純です (含める必要があるだけです<boost/test/included/unit_test.hpp>が、ビルド時間が大幅に増加するという大きな欠点があります。

于 2012-03-17T08:15:04.260 に答える
3

この呼び出しは、CMake変数でfind_package(Boost COMPONENTS ...)検索されたBoostコンポーネント(たとえば)に必要なリンクライブラリを収集します。unit_test_frameworkBoost_LIBRARIES

リンクエラーを取り除くには、次を追加します。

target_link_libraries(test ${Boost_LIBRARIES})
于 2012-03-17T08:51:36.667 に答える
1

編集 2020-02

Boost.Test モジュールの構築の詳細は、こちらのドキュメントに記載されており、ドキュメントの多くの例で説明されています。通常、mainが見つからない場合は、次のことが原因である可能性があります。

  • Boost.Test の静的ライブラリ バージョンと共有ライブラリ バージョンの混合 (リンカーは共有ライブラリを優先します)
  • BOOST_TEST_MODULEand/orマクロの不適切な定義BOOST_TEST_DYN_LINK: それらに応じて、Boost.Test フレームワークは a を (正しく) 定義するmainかどうかを決定します。

前の(間違った)回答

ここでの問題は、cmake がライブラリを見つけられないことではboost_unit_test_frameworkなく、この特定のライブラリmainにバイナリを実行するためのエントリ ポイントが含まれていないことです。

${Boost_TEST_EXEC_MONITOR_LIBRARY}実際、適切な定義が含まれているため、リンクする必要があります。また、マクロの定義も避ける必要がありBOOST_TEST_DYN_LINKます。

于 2013-04-25T07:38:03.760 に答える