c++ - Lib 文件和定义

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

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

所以如果我不能将库打包为 lib 文件,我有什么方法可以链接到 c 或 cpp 源文件吗?可能不是,因为必须先编译它们,但也许我错了。

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

最佳答案

库是一个二进制文件,所以所有的定义显然已经在里面了。

为了方便起见,定义被评估为编译过程的第一阶段 - 该步骤称为预处理。在此阶段,为每个 cpp 文件创建一个包含所有 #include 的递归文件,并对所有宏进行求值。

除了一个异常(exception),第 3 方不应依赖于您的编译标志 - 发布/构建库。只有在这种情况下,您才需要 2 个版本的第三个库。

关于在编译您的代码时是否编译一次或每次编译 3rd 方库的问题取决于它。如果您只为自己做而不是做对您来说看起来简单的方法,但如果我们谈论的是开发团队和要长期维护的项目,那么要考虑的事情就更多了。

所以我们正在为一个团队讨论一些可靠的解决方案,我们想多次编译库。

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

很好,但是你在哪里保存这些库。我喜欢物理分离——第 3 方库和我的代码不在同一棵树中。这样可以避免一些非故意的错误。一个好的构建系统,大多数时候是强制性的,应该是可重建的。这意味着如果您在一年后检查您的代码,您可以编译并接收完全相同的二进制文件。

一旦我在我的机器上使用了一些外部只读树。这棵树只有我一个人管理。 为了使我的源代码可重新构建,第 3 方库的每个下一个版本都放入包含它的版本的 direcoty 中,并且我的源代码树已更新以指向这一点。如果您在多台机器上构建,那么只读树应该在所有这些机器上都可见。

其他解决方案是检查您的 SCM 工具(我想您使用的是一个)是否使您能够将存储库中的多个子尝试组合到一个检查区中。对于每个第 3 方库,都有一个子树。这样,您构建的所有机器上都可以使用第 3 方库。我目前在颠覆中使用这些方法——它叫做 svn:external。在 CVS AFAIK 上它被称为 cvs 模块。库由源代码控制系统管理的额外优势,因此您可以跟踪对第 3 方库所做的所有更改。

关于c++ - Lib 文件和定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5360852/

相关文章:

c++ - 奇怪的问题移植应用程序。标准库中 undefined reference 错误

java - 从 char 解析 Float

c++ - 使用c++和cygwin sshd服务的黑色截图

C++ 偶数或奇数程序无法正常工作

android - 如何只编译使用过的资源

c# - 是否可以调试在运行时编译的代码?

Haskell ghc,尝试使用 ghc 和 Euterpea 编译程序时出现链接错误

c - 可以强制可执行文件使用用户定义的 'malloc' 吗?

c++ - 2010 版 MFC 代码在 2013 年不再工作,有什么建议吗?

java - 备用java语言