2012-03-15 33 views
2

当我需要在不同版本的MSVC中构建一些用于我的几个项目中的第三方库时,我通常会为其 MSVC版本和两个调试版本配置。这就是推动力所在,而这正是我们在我们整个人生中为我们所做的一切。如何在我的项目中正确构建用于调试和发布配置的第三方库?

但是,我仍然没有得到,为什么我不能像建立这个库...什么。我需要的只是函数原型和目标代码,对吧?由于我静态链接CRT,我没有外部依赖。但是当我试图将MSVC8下的Release版本与我在MSVC10下调试的项目链接起来时,我有这个烦人的“已定义”链接器错误,我们都非常讨厌这个错误。

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

回答

3

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

好吧,这不是真的,你有依赖性。在CRT的静态版本上。调试或发布,具体取决于您的构建设置。这是一种外部依赖性,链接器在图书馆被链接后粘合CRT。使用该库的代码也依赖于CRT。如果编译设置不匹配,那么链接器barfs。

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

+0

不错的答案! “...链接器稍后黏合CRT,当库链接时...” - 是否有强制链接器链接到.lib中的CRT函数的方法?我可以将自己的代码链接到,为什么我不能强制CRT链接? – Mikhail 2012-03-15 16:38:00

+1

这不是静态.libs的工作方式。这是一个非常简单的文件格式,只是一个.obj文件的集合。你强制链接器通过创建一个DLL链接CRT。 – 2012-03-15 16:55:09

相关问题