重複の可能性:
gccの「-l」オプションの順序が重要なのはなぜですか?
BoostUnitTestフレームワークを学び始めています。最小限のテストスイートがあります。
#define BOOST_TEST_MAIN
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE( test1 ) {
BOOST_CHECK( 2 == 1 );
}
まず、ソースをコンパイルします。
g++ -c src/tests.cc -o src/tests.o
これはエラーなしで完了します。次に、次のようにリンクできます。
g++ -o tests src/tests.o -lboost_unit_test_framework
これもエラーなしで完了します。結果のバイナリは、期待される結果で実行されます。ただし、との順序を入れ替えるsrc/tests.o
と-lboost_unit_test_framework
、リンカーエラーが発生します。
g++ -o tests -lboost_unit_test_framework src/tests.o
src / tests.o:関数 `main'内: tests.cc:(。text+0x29): `boost :: unit_test :: unit_test_main(bool(*)()、int、char **)'への未定義の参照 src / tests.o:関数 `test1 :: test_method()'内: tests.cc:(。text+0x9d): `boost :: unit_test :: unit_test_log_t :: set_checkpoint(boost :: unit_test :: basic_cstring、unsigned int、boost :: unit_test :: basic_cstring)'への未定義の参照 tests.cc:(。text+0x146): `boost :: test_tools :: tt_detail :: check_impl(boost :: test_tools :: predicate_result const&、boost :: unit_test :: lazy_ostream const&、boost ::unit_test::への未定義の参照basic_cstring、unsigned int、boost :: test_tools :: tt_detail :: tool_level、boost :: test_tools :: tt_detail :: check_type、unsigned int、...) ' src / tests.o:関数 `__static_initialization_and_destruction_0(int、int)': tests.cc:(。text+0x24d): `boost :: unit_test :: ut_detail :: auto_test_unit_registrar :: auto_test_unit_registrar(boost :: unit_test :: test_case *、unsigned long)'への未定義の参照 src / tests.o:関数 `boost :: unit_test :: unit_test_log_t :: unit_test_log_t()': tests.cc:(。text._ZN5boost9unit_test15unit_test_log_tC2Ev[_ZN5boost9unit_test15unit_test_log_tC5Ev]+ 0x21): `vtable for boost :: unit_test ::unit_test_log_t'への未定義の参照 src / tests.o:関数 `boost :: unit_test :: make_test_case(boost :: unit_test :: callback0 const&、boost :: unit_test :: basic_cstring)': tests.cc:(。text._ZN5boost9unit_test14make_test_caseERKNS0_9callback0INS0_9ut_detail6unusedEEENS0_13basic_cstringIKcEE[boost:: unit_test :: make_test_case(boost :: unit:unit_test :: callback0 const&、boost :: unit_test :: bas ut_detail :: normalize_test_case_name(boost :: unit_test :: basic_cstring) ' tests.cc:(。text._ZN5boost9unit_test14make_test_caseERKNS0_9callback0INS0_9ut_detail6unusedEEENS0_13basic_cstringIKcEE[boost:: unit_test :: make_test_case(boost :: unit:unit_test :: callback0 const&、boost :: unit_test :: bas test_case :: test_case(boost :: unit_test :: basic_cstring、boost :: unit_test :: callback0 const&) ' src / tests.o:関数 `boost :: unit_test :: unit_test_log_t ::〜unit_test_log_t()': tests.cc:(。text._ZN5boost9unit_test15unit_test_log_tD2Ev[_ZN5boost9unit_test15unit_test_log_tD5Ev]+ 0xb): `vtable for boost :: unit_test ::unit_test_log_t'への未定義の参照 collect2:ldが1つの終了ステータスを返しました
引数の順序がリンカーエラーを引き起こすのはなぜですか?