如果我在目标文件和库中定义了相同的符号,GNU链接器将从目标文件中获取符号。考虑这个例子:
g++ -L"dir/to/lib" -o Executable Test.o foo.o -lMyLib
如果我在foo.cpp中定义了一个具有相同签名的函数foo
,并且在源文件中编译了“MyLib”,那么如果我使用此命令,GNU链接器总是更喜欢前一个
这种行为GNU工具链是否具体?您是否知道其他连接器的行为方式相同?这是否记录在案(GNU文档,C ++标准)?我找不到任何东西......
我想在进行单元测试(也就是链接接缝)时使用此功能替换/模拟某些功能。
答案 0 :(得分:8)
来自http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html:
“链接器按照指定的顺序搜索和处理库和目标文件”
答案 1 :(得分:3)
可能。
链接器处理文件的确切方式取决于 链接器,但在你描述的确切情况下,我认为不会 是任何变化。指定目标文件时,包含 进入你的最终版本,你将获得它定义的任何符号; 如果两个目标文件定义相同的符号,通常会得到一个 来自链接器的错误(但有一些例外,由于弱符号或 类Fortran处理数据定义)。图书馆是一个集合 目标文件;库的标准处理是链接器的 扫描它,并合并任何对象(只有那些对象) 定义一个否则未定义的外部。如果是目标文件 库只定义了有问题的符号,其定义有 已经由显式指定的目标文件即链接器解析 不会将库中的目标文件合并到程序中。 但是,如果库中的目标文件也定义了其他符号, 其中一个解决了另外一个未定义的外部对象 来自图书馆的文件将被整合到您的程序中 它定义的所有符号。这可能导致多重 定义
答案 2 :(得分:0)
从语言的角度来看,“链接顺序”是未指定的,不能以可靠的方式使用。
通过平台(工具链)的立场,它必须以某种方式指定,并且 - 通常 - 它考虑所有未在本地解析的所有符号的对象和对象中解析的所有符号的库。 这允许开发人员屏蔽/替换库函数。
现在,gcc(作为msvc)以启动链接器的命令行的相同顺序链接。这种行为是否可以“信任”(从某种意义上说,它将在未来的版本中保留)尚不清楚。 (GCC文档使用现有动词编写......)