如何解析外部符号
How are external symbols resolved?
我有两个文件37064544_p1.cpp
&37064544_p2.cpp
,内容如下:
int add(int x,int y)
{
return x+y;
}
我用编译了它们
g++ -c 37064544_p2.cpp -o 37064544_p2.o
g++ -c 37064544_p2.cpp -o 37064544_p2.o
并使用将它们添加到档案中
ar -rsc lib37064544pf.a 37064544_p1.o 37064544_p2.o
和
$ nm -s lib37064544pf.a
给我:
Archive index:
_Z3addii in 37064544_p1.o
_Z3addii in 37064544_p2.o
37064544_p1.o:
0000000000000000 T _Z3addii
37064544_p2.o:
0000000000000000 T _Z3addii
和
$ ar -t lib37064544pf.a
给我
37064544_p1.o
37064544_p2.o
我有一个驱动程序,它调用用编译的_Z3addii
函数
g++ -static 37064544driver.cpp -o 37064544driver.elf -L. -l37064544pf
结果是
Sum : 11
问题
符号
_Z3addii
是如何解析的?- 是否根据档案索引
- 它是否根据我们使用
ar
填充归档的顺序
如何更改此订单?
- 如何防止
ar
具有重复符号
编译器:g++4.6.3
符号_Z3addii是如何解析的?
实现可以自由地做它喜欢做的任何事情,这违反了一个定义规则。
实际上,在第一次匹配后,它将停止寻找任何给定的符号,这可能遵循文件插入存档的顺序。
如何更改此订单?
使用ar
,在插入对象文件时,可以使用a
(after)和b
(before)修饰符在归档中定位对象文件,但这仍然违反了ODR。
如何防止ar有重复的符号?
据我所知,ar
相对来说是愚蠢的,这是有充分理由的,因为有些语言确实允许相同的符号,这就是为什么在链接到存档时不会出现任何错误(ODR违规不需要诊断)。
您可以强制ld
读取整个档案
g++ -static 37064544driver.cpp -o 37064544driver.elf -L.
-Wl,--whole-archive -l37064544pf -Wl,--no-whole-archive
或者你可以做一个部分链接,而不是传统的存档,如果有任何重复的,这会给你一个错误
ld -r -o lib37064544pf.a 37064544_p1.o 37064544_p2.o
相关文章:
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 未解析的外部符号_MsiLocateComponentW@12.
- 在C++中使用 gRPC 时未解析的外部符号
- LibPrivoxy: 未解析的外部符号 __declspec(dllimport) int __stdcall Sta
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 我收到错误LNK2001:未解析的外部符号(C++代码)
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 仅在少数方法(静态或共享库)中解析的外部符号
- 未解析的外部符号"__declspec(dllimport)与 Spdlog c++ 库
- 函数 _main (OPENGL C++) 中引用的未解析的外部符号 ________
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- 使用静态 constexpr 成员的未解析外部符号
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- Dlib LNK2001未解析的外部符号USER_ERROR__consistent_build_configurati
- 矛盾的未解决的外部符号+未使用的库与VS2017和FFMPEG 4
- 链接器错误:切换到unicode生成给出:未解析的外部符号WinMain
- 错误 LNK2019:未解析的外部符号"外部"C"此错误是什么?
- 错误 : LNK2019: 未解析的外部符号"外部 "C"