如何在我的项目中正确构建要在Debug和Release配置中使用的第三方库?

时间:2012-03-15 13:42:14

标签: visual-studio debugging release crt linkage

当我需要构建一些第三方库以在不同版本的MSVC下的几个项目中使用时,我通常会为每个 MSVC版本和两者调试和发布配置。这就是提升的作用,这就是我们团队一生所做的一切。

然而,我仍然没有得到,为什么我不能像...那样构建这个库。我需要的只是函数原型和目标代码,对吧?由于我是静态链接CRT,因此我没有外部依赖。但是,当我尝试将MSVC8下的Release内置的库与我在MSVC10下的Debug中的项目链接时,我有这个恼人的“已经定义”的链接器错误,我们都非常讨厌这些错误。

但为什么呢?我可以将所有这些函数“封装”在lib中并且不导出它们以便我的项目只需要从lib中获取它需要的内容吗?为什么我可以在每个项目中链接libpng和zlib的预编译版本?是的,我猜它们不是使用MSVC构建的,但仍然使用与CRT相同的功能。那么有人可以请深入解释或分享一些关于这个问题的开明解释的链接吗?

1 个答案:

答案 0 :(得分:3)

  

由于我是静态链接CRT,因此我没有外部依赖

嗯,这不是真的,你有依赖。在CRT的静态版本上。调试或发布,具体取决于您的构建设置。它是一个外部依赖,当库被链接时,链接器后来粘合CRT。使用该库的代码也依赖于CRT。如果编译设置不匹配,则链接器barfs。

通过构建DLL而不是静态链接库来隔离该依赖项。您必须进一步确保导出的函数不会导致CRT依赖性。您无法从标准C ++库返回C ++对象,也无法返回指向需要由客户端代码释放的对象的指针。即使传递结构也很棘手,因为它们的打包是一个实现细节,但你通常会侥幸逃脱它。一个很好的实际例子是COM自动化,它迫使您使用通用类型的子集。 Windows充斥着它们,所有这些服务器都适用于任何版本的编译器或CRT。甚至任何语言。然而,这需要付出代价,编写这样的库并不像在静态库中抛出一堆代码那样简单或方便。