如何强制MSVC ++忽略静态库的CRT依赖?

时间:2009-03-26 19:21:30

标签: visual-c++ runtime static-libraries msvcrt

我不知道是否可以这样做,但我希望将/ NODEFAULTLIB应用于静态库项目。

我有许多使用公共静态库D.lib的应用程序项目(A.exe,B.dll,C.dll)。 这个库有很多代码,也有其他.lib依赖项。其中一个是openssl库,它似乎是针对CRT的发布版本为win32而构建的(我没有原始项目/来源)。

到目前为止,为了避免混合使用CRT的Release / Debug版本,我必须在所有叶子项目(A.exe,B.dll)中放置/NODEFAULTLIB:msvcrt.lib链接器指令。这有效,但我认为这不是处理这个问题的理想方式。 我试图将此属性放在D.lib项目中,但它没有效果。

有没有办法强制msvc ++忽略第三方库中的msvcrt.lib依赖?

3 个答案:

答案 0 :(得分:2)

.lib没有任何链接器设置,因为您没有链接它,您将链接到。 .lib只是.obj文件的存档,有点像未压缩的.zip文件 - 这就是为什么你必须将设置放在链接到它的所有项目上。

如果您使用的是VS2005 +,则可以使用属性表,这样您只需将设置放在一个位置,然后在所有项目中使用该属性表。

然而,OpenSSL只是 - 开源,所以你应该能够获得你正在使用的版本的源代码并再次构建它(当然,将它添加到你的版本控制系统)。我认为OpenSSL可以构建为DLL或LIB,这可以解决您的问题,因为DLL不会干扰代码的链接。

如果不这样做,您总是可以选择将您的功能分解为单独的DLL,这样您只会遇到一个项目的问题。

答案 1 :(得分:0)

我的理解是,如果库LIB静态链接到DLL中,则DLL中已包含来自LIB的所有相关代码。因此,不能消除这种耦合。这只是基于我对静态链接的理解,而不是基于实验。

答案 2 :(得分:0)

要防止分布式静态链接库依赖于特定的MSVC运行时库,您需要设置此编译器选项(在Visual Studio 2010中看起来像):

配置属性 - > C / C ++ - >高级 - >省略默认库名称=是(/ ZI)

现在,您的用户可以从他们的调试版本链接到您的发布版本的静态库,而不是尝试链接到不正确的运行时库,从而导致问题,以及链接器警告。

请注意,如果您的库实际上依赖于特定的运行时库或其行为,则可能会导致链接错误,并且不会以其他方式提供兼容的组件。