为什么gcc链接器对.a文件和.o文件的行为不同
Why does the gcc linker behave differently with .a files and .o files?
使用这个关于gcc中链接顺序的好答案中的例子,我尝试了以下操作:
echo 'extern int b; int a = b;' > b.cpp
g++ -c b.cpp -o b.o
ar cr libb.a b.o
echo 'int b;' > d.cpp
g++ -c d.cpp -o d.o
ar cr libd.a d.o
echo 'extern int a; int main() { return a; }' > a.cpp
g++ a.cpp -o a1 d.o b.o # Works
g++ a.cpp -o a2 libd.a libb.a # Fails
如果.a
文件只是一个包含一个或多个.o
文件的存档文件,为什么与lib*.a
文件链接(如原始答案中所述,顺序错误)失败,但直接使用.o
文件(按相同顺序)有效?
就链接器而言,静态库和对象文件之间的区别在链接序列中是:-
-
对象文件将被链接,因为它是对象文件,无论它是否提供可执行文件所需的任何符号的定义。如果你不想要一个对象要链接的文件,不要向链接器提及它。
-
静态库是要从库并链接(如果需要),其中库中的对象文件是必需的当且仅当它提供了至少一个迄今未定义的定义链接器在早期中出现的对象文件或库中观察到的符号链接序列。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 错误 VSP1011:无法获取调试信息.与 /配置文件链接器开关链接
- 将我的主输出库与测试可执行文件链接时出现问题
- CMake + Qt + GTest 文件链接
- 生成文件链接
- 使用LTO静态链接的可执行文件(链接时间优化):如何使用以前构建的库进行制作
- 生成文件链接错误
- 使用 c++ 生成文件的文件链接
- 生成文件:链接器错误
- 反转头文件/链接
- C++实现和头文件链接
- .cpp文件将不会与.h文件链接
- 将问题与多个文件链接在一起
- 编译三个C++文件.链接错误
- C++如何将我的主类与我的头文件链接起来
- 使文件链接问题 架构x86_64的未定义符号
- c++和mex文件链接错误
- 使用堆叠类生成文件链接问题
- 使用对象文件链接c++中的东西