7

重複の可能性:
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つの終了ステータスを返しました

引数の順序がリンカーエラーを引き起こすのはなぜですか?

4

2 に答える 2

11

GCCがリンクを実行する場合、ライブラリは特別に扱われます。コマンドラインリストでライブラリの前にあるオブジェクトファイルから欠落しているシンボルのみがライブラリから入力されます。ライブラリの後にさらにオブジェクトファイルがある場合、そのオブジェクトから欠落しているシンボルはライブラリで検索されません。

簡単に言うと、最初にオブジェクトファイルをリストし、最後にライブラリをリストします。

于 2012-08-12T23:16:25.127 に答える
3

リンカの従来の動作は、コマンドラインで指定されたライブラリで左から右に外部関数を検索することです。つまり、関数の定義を含むライブラリは、それを使用するソースファイルまたはオブジェクトファイルの後に表示される必要があります。これには、次のコマンドに示すように、ショートカット-lオプションで指定されたライブラリが含まれます。

http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html

于 2012-08-12T23:15:36.453 に答える