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

我有许多使用通用静态库D.Lib的应用程序项目(A.EXE,B.DLL,c.dll)。该库有很多代码,还具有其他.lib依赖性。其中之一是OpenSSL库,它似乎是为Win32构建的,该库是针对CRT的发行版本(我没有原始项目/来源)。

到目前为止,为了避免CRT的发行 /调试版本的混合,我必须将 /nonodefaultlib:msvcrt.lib链接器指令放入所有叶子项目(A.EXE,b.dll)中。这有效,但我认为这不是解决该问题的理想方式。我试图将此属性放入D.Lib项目中,但没有效果。

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

有帮助吗?

解决方案

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

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

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

如果不这样做,您始终可以选择将功能插入单独的DLL中,以便您只有一个项目有问题。

其他提示

我的理解是,如果库中的lib静态地链接到dll,则DLL包含LIB的所有相关代码。因此,无法删除此耦合。这仅基于我对静态链接的理解,而不是基于实验。

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

配置属性 - > c/c ++->高级 - >省略默认库名称= yes(/zi)

现在,您的用户可以通过调试构建链接到您的版本构建的静态lib,而不是尝试链接到不正确的运行时库,从而引起问题以及链接器警告。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top