重新研究静态库的链接分析

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。

 

 

 

阅读(0) 收藏(0) 转载(0) 举报/Report
相关阅读

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有