编译链接5大潜规则

转自:http://blog.csdn.net/zdl1016/article/details/9015447


潜规则1:

当一个符号在多个目标文件(.o)里同时出现时, LD报错. 提示符号多重定义.

当一个符号在多个静态库(.a)里同时出现时, LD不报错, 以第一个遇到的为准. 并且不会有任何warning提示 !!! 这个潜规则可能导致很多意想不到的问题!!!



潜规则2: LD对依赖库的输入顺序敏感.
LD在链接生成目标文件时, 会从左到有扫描输入的依赖库, 但是, 当依赖库之间也有依赖关系时,必须将依赖别人的库放在 “被别人依赖的库的前面. 否则,会链接失败! 这点和vc++很不一样哦.


潜规则3:头文件搜索

gcc在寻找头文件时, 会按照一定的顺序在很多个目录挨个寻找, 一旦找到一个即停止寻找. 如果项目中存在多个同名的头文件, 则以第一个为准, 后面的直接忽略. 这个特性会导致很多编译不通过的问题!

GCC的寻找依赖的头文件顺序参看Bloghttp://blog.csdn.net/crylearner/article/details/17013187


潜规则 4 :

 ld 会把所有通过-l指定的动态库全部链接进最终的目标程序中, 无论是否真的用到(导致生产环境加载失败)。

所以不需要的库就不要加入。

潜规则5:

假设我们知道undified symbol的符号确定存在xxx.a里面.虽然使用了Makefile里面加上了xxx.a的依赖, 但是, 一定要把xxx.a放在最后面. 因为有可能so依赖的其他的.a库也用到了xxx.a.否则极容易出现undifined symbol



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章