为什么当我更改 g++ 参数的顺序时,我的程序无法链接?
Why does my program fail to link when I change the order of g++'s arguments?
可能的重复项:
为什么 gcc 中"-l"选项的顺序很重要?
我开始学习提升单元测试框架。我有一个最小的测试套件:
#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::p redicate_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*,无符号长整型)"的未定义引用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_test::callback0 const&, boost::unit_test::basic_cstring)]+0x1d): 未定义对'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): 未定义对 'boost::unit_test::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"的引用收集2:LD 返回 1 个退出状态
为什么参数的顺序会导致链接器错误?
当 GCC 执行链接时,库会得到特殊处理:只有命令行列表中库之前的对象文件中缺少的符号才会从库中填充。如果在库之后还有其他对象文件,则不会在库中查找该对象中缺少的符号。
简而言之,首先列出您的目标文件,最后列出库。
链接器的传统行为是在命令行上指定的库中从左到右搜索外部函数。这意味着包含函数定义的库应该出现在使用它的任何源文件或目标文件之后。这包括使用快捷方式 -l 选项指定的库,如以下命令所示:
http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html
相关文章:
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我的 IExtractIcon 处理程序没有被调用?
- 为什么我的程序在for循环中k=0时返回垃圾值
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 我的程序没有从文件中读取并输入数据
- 我的评分程序无法正常工作
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 反向功能超出了我的 cpp 程序的范围
- 我的二进制搜索程序只是关闭了
- 为什么我的程序不能显示斐波那契级数?
- 为什么我的程序在使用预留后没有加速?
- 为什么如果我添加这一行,我的程序会不断询问值
- 为什么当我输入较大的数字时,我的程序会到达文件末尾?
- 为什么我的两个 cin 语句没有在程序结束时运行?
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- C++机器人程序(我的私人服务器)出现问题
- 用C++创建一个写作应用程序(我的第一个项目)(学习C++)