读书人

求稳静态链接库lib的有关问题(100分!)

发布时间: 2012-06-15 19:37:05 作者: rapoo

求稳静态链接库lib的问题(100分!!!)
使用静态库疑问:
已知静态库有Debug版本和Release版本
链接静态库的exe有Debug版本和Release版本

环境:
VS2008

现象:
1.Debug版本的exe调用Release版本的lib,Release版本exe调用Debug版本的lib,会有问题吗?

2.boost库编译出来的lib和dll只有一个版本,我调boost库的函数没有警告

3.x64下,Debug版本exe调用Release下版本的lib有警告:
找到 MSIL .netmodule 或使用 /GL 编译的模块;正在使用 /LTCG 重新启动链接;将 /LTCG 添加到链接命令行以改进链接器性能
1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)

4.x86下,Debug版本exe调用Release下版本的lib木有任何警告

问题:
1.把lib作为公共库,是否只需要一个Release版本就行了,我没发现boost库分两个版本
2.如何去掉Debug版本的exe调用Release版本的lib的警告
3.lib始终用Release,调用lib的exe和dll会有什么影响么
4.x64下出现警告的理由是啥,为什么x86下没有,我确定配置完全相同

[解决办法]
《程序员的自我修养——链接、装载与库》
[解决办法]
Debug版本的exe调用Release版本的lib,Release版本exe调用Debug版本的lib
-> 静态lib这样子互相调用不知道有没有问题,没有这样做过,但是dll的话这样做肯定是有问题的

还有boost的debug和release的静态库其实是不一样的,编译的时候没报错是因为编译器在编译的时候自动链接到对应的静态库上了。
[解决办法]
1、可以只保留Release库,除非你想调试Boost自身

2、取决于什么警告和库的实现方式

3、可能有影响,也可能无影响,取决于调用CRT的方式和实现

4、不知道,得看所有的命令行。/INCREMENTAL和/LTCG不能共同使用。x86也不行。你确定配置完全相同不能说明任何问题,别人都不知道/INCREMENTAL到底有没有添加。
[解决办法]

探讨

静态库用/GL没用吧,他仅仅是简单的吧obj打包,并没有做跨obj的优化


[解决办法]
探讨

1.刚刚查了不少资料,我把我的公共库lib的/GL关掉了,这样的话该lib还是最优速度的吧?
2.改了之后只剩默认库“libcmt.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library这个警告,我知道是因为我的lib是Release+MT编译的,而exe是Debug+MTD,所以会这样,那么我忽略之后会有什么影响吗?忽略后我能调试多线程吗?

[解决办法]
都正常运行不了,当然就不能调试了

另外,PGO优化在VC2005时代就有了,只不过Express版本没有而已

这个算不修改代码的情况下的终极优化了,所以不要在Release之前使用,否则调试也不好调试,构建还费时间。
[解决办法]
Linux一般不需要,除非特定的应用
因为他的-g是最终文件和调试信息是集合在一起的,vc是分离的
Linux下不论使用Release还是Debug,都推荐使用-g编译(非最终版本),这样Release版本也可以调试

当然,gcc没有源码无法跟踪函数名称,vc可以跟踪接口(有pdb即可)

读书人网 >C++

热点推荐