Lib文件和定义

时间:2011-03-19 07:47:43

标签: c++ compiler-construction linker c-preprocessor

我正在使用几个外部库,而不是必须在主源目录或项目文件中包含所有源文件和头文件。一种选择是将库编译为lib文件并将它们链接起来。但是我不确定在创建lib文件之前或之后评估定义(哪一个是?)。如果它在那之前显然我不能只打包它们,因为它们可能无法在不同的编译器或系统上正常工作。

因此,如果我不能将库打包为lib文件,有没有办法在c或cpp源文件中链接?可能不是,因为他们必须先编译,但也许我错了。

编辑:这是一个基于答案的后续问题。你认为拥有一个创建lib文件的makefile会有太多的麻烦吗?我仍然不想将源添加到我的项目或源目录中。

2 个答案:

答案 0 :(得分:3)

库是一个二进制文件,因此显然已经定义了所有。

只是为了进行排序,定义被评估为编译过程的第一阶段 - 该步骤称为预处理。在这个阶段,为每个cpp文件创建一个文件,其中包含所有#include'ed文件,并且所有宏都会被评估。

第三方不应该依赖于你的编译标志,只有一个例外 - release / build lib。只有在这种情况下,您需要2个版本的3rd lib。

关于在编译代码时是否编译一次或每次编译第三方库的问题,这取决于。如果你只为自己做这件事而不是为你做一个简单的方式,但如果我们谈论的是开发团队和要长期维护的项目,那么就要考虑更多的事情了。

因此,我们正在讨论团队的一些可靠解决方案,我们希望多次编译库。

在这种情况下,我个人努力编译第三部分库一次并多次使用它。这减少了每个开发人员的每个构建的编译时间,这意味着更快的开发。

很好,但你拿着这些libs。我喜欢phisycal分离 - 第三方库和我的代码不在同一个树中。这可以避免一些非故意的错误。一个好的构建系统,并且大部分时间是强制性的,应该可以重新构建。这意味着如果您在年后检查代码,则可以编译并接收完全相同的二进制文件。

在我的机器上使用了一些外部只读树。这棵树只由我管理。 为了使我的源可重新构建,第三方库的每个下一版本都包含了包含它的版本的direcoty,并且我的源代码树已更新为指向这一点。如果你在几台机器上构建,那么所有这些机器上都应该只显示只读树。

Additioanal解决方案是检查你的SCM工具(我想你使用它)是否能够在一个checkhout中组合来自存储库的多个子尝试。对于每个第三方库,都有一个子树。这样,您构建的所有计算机上都可以使用第三方库。我当前在subversion上使用这些方法 - 它叫做svn:external。在CVS AFAIK上,它被称为cvs模块。图书馆由源控制系统管理的额外优势,因此您可以跟踪对第三方库进行的所有更改。

答案 1 :(得分:2)

define即使在编译之前也会得到评估。它们由预处理器处理,准备编译器使用的代码。所以,是的,在创建库之前对它们进行评估。

您无法链接来源代码。您只能链接目标文件,静态库或动态库(共享对象文件/ DLL)。

使用动态链接可能是一个不错的选择,特别是如果外部很大和/或您将在许多可执行文件中使用它们。