繁体   English   中英

Lib文件和定义

[英]Lib Files and Defines

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

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

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

库是一个二进制文件,因此所有定义都已经明确。

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM