重新研究静态库的链接分析
2024-12-26 13:47:07
标签: static link symbol
创建main.cpp
int referencedFunctionA();
int main()
{
std::cout
<< "Hello World!\n";
int ref =
referencedFunctionA();
}
并实现一个静态库,包括两个文件a.cpp,b.cpp
int unresolvedExternalFunctionA();
// TODO: 这是一个库函数示例
int referencedFunctionA()
{
return 3;
}
int unreferenedFunction()
{
return unresolvedExternalFunctionA();
//return 5;
}
b.cpp
int referencedFunctionB()
{
return unresolvedExternalFunctionB();
}
下面谈结论
1.
主程序引用a.cpp中方法referencedFunctionA,链接静态库时永远不会报错,不会找未定义的实现,在主程序产生时,引用静态库,并根据调用函数,找到a.o,这时它要求a.o中所有的代码都没有未定义符号,而上面的例子里由于有unresolvedExternalFunctionA,会报Link
Error.
把unresolvedExternalFunctionA直接改成return
5,链接就过了。此时在同一个静态库中,还存在另一个b.o引用了未定义符号,它不会报错,因为对b.o根本没引用,链接器会直接忽略它。
同时,如果你去查看代码,上面例子中,return 5还是存在的,虽然
unreferenedFunction未被调用,但实现代码确是存在在目标的EXE的结果中。
我们可以用/OPT:REF选项把它去掉,这时候你再查看目标EXE,未引用的方法就会当成dead
code被删掉,但是注意/OPT:REF是在链接这步之后,如果链接时它存在未定义符号,哪怕这个函数,你没调,依然会有Link
Error。
重新研究静态库的链接分析
创建main.cpp
int referencedFunctionA();
int main()
{
std::cout << "Hello World!\n";
int ref = referencedFunctionA();
}
并实现一个静态库,包括两个文件a.cpp,b.cpp
int unresolvedExternalFunctionA();
// TODO: 这是一个库函数示例
int referencedFunctionA()
{
return 3;
}
int unreferenedFunction()
{
return unresolvedExternalFunctionA();
//return 5;
}
b.cpp
int referencedFunctionB()
{
return unresolvedExternalFunctionB();
}
下面谈结论
1. 主程序引用a.cpp中方法referencedFunctionA,链接静态库时永远不会报错,不会找未定义的实现,在主程序产生时,引用静态库,并根据调用函数,找到a.o,这时它要求a.o中所有的代码都没有未定义符号,而上面的例子里由于有unresolvedExternalFunctionA,会报Link Error.
把unresolvedExternalFunctionA直接改成return 5,链接就过了。此时在同一个静态库中,还存在另一个b.o引用了未定义符号,它不会报错,因为对b.o根本没引用,链接器会直接忽略它。
同时,如果你去查看代码,上面例子中,return 5还是存在的,虽然 unreferenedFunction未被调用,但实现代码确是存在在目标的EXE的结果中。
我们可以用/OPT:REF选项把它去掉,这时候你再查看目标EXE,未引用的方法就会当成dead code被删掉,但是注意/OPT:REF是在链接这步之后,如果链接时它存在未定义符号,哪怕这个函数,你没调,依然会有Link Error。