c++ - 当我更改 g++ 参数的顺序时,为什么我的程序无法链接?

标签 c++ boost compilation linker g++

<分区>

Possible Duplicate:
Why does the order of '-l' option in gcc matter?

我开始学习 Boost 单元测试框架。我有一个最小的测试套件:

#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: In function `main':
tests.cc:(.text+0x29): undefined reference to `boost::unit_test::unit_test_main(bool (*)(), int, char**)'
src/tests.o: In function `test1::test_method()':
tests.cc:(.text+0x9d): undefined reference to `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): undefined reference to `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: In function `__static_initialization_and_destruction_0(int, int)':
tests.cc:(.text+0x24d): undefined reference to `boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, unsigned long)'
src/tests.o: In function `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): undefined reference to `vtable for boost::unit_test::unit_test_log_t'
src/tests.o: In function `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_test::callback0 const&, boost::unit_test::basic_cstring)]+0x1d): undefined reference to `boost::unit_test::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_test::callback0 const&, boost::unit_test::basic_cstring)]+0x5d): undefined reference to `boost::unit_test::test_case::test_case(boost::unit_test::basic_cstring, boost::unit_test::callback0 const&)'
src/tests.o: In function `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): undefined reference to `vtable for boost::unit_test::unit_test_log_t'
collect2: ld returned 1 exit status

为什么我的参数顺序会导致链接器错误?

最佳答案

当 GCC 执行链接时,库会被特殊对待:只有在命令行列表中出现在库之前的目标文件中缺少的符号才会从库中填充。如果您在某个库之后还有更多目标文件,则不会在库中查找该对象中缺少的符号。

简而言之,首先列出目标文件,最后列出库。

关于c++ - 当我更改 g++ 参数的顺序时,为什么我的程序无法链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11926580/

相关文章:

c++ - 为什么 ADL 不能使用未命名的 initializer_list?

java - 找不到符号错误,拼写错误和参数均不正确

c++ - 为什么在没有模板声明编译的情况下包含在模板类中使用模板参数的友元函数的实现?

c++ - 创建没有夏令时的 boost::local_time::custom_time_zone

c++ - 为什么 fill() 在一维数组上使用时编译,但在多维数组上不编译

c++ - boost program_option 不区分大小写的配置文件解析

c++ - 以线的形式显示 Boost 矩阵。想改成盒子

c++ - 使用 boost 异步发送和接收自定义数据包?

xcode - XCode-ml.hpp中的#include <map>:没有这样的文件或目录

c++ - 我的自制小应用程序立即关闭