2

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

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

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

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

4

3 回答 3

2

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

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

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

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

于 2009-05-13T09:49:11.497 回答
0

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

于 2009-05-13T09:04:54.470 回答
0

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

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

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

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

于 2014-02-17T06:20:40.023 回答