【发布时间】:2012-06-06 22:43:02
【问题描述】:
C++(和 C,尽管在那儿不太重要)标准规定程序中的所有翻译单元都需要具有相同的定义;这包括编译器开关之类的东西。例如,在 MSVC++ 上,必须在所有翻译单元中链接到正确版本的 C 运行时库(/MT vs /MD vs /MTd vs /MDd)。
但是,我们想使用几个第三方依赖项,其中有几件事:
- 他们都使用不同的构建系统(有一个 autoconf,有一个 cmake,还有一个似乎有它自己的手工制作的东西..)
- 构建系统并非都在其配置中公开这些类型的开关,并且硬编码的开关在不同的系统中设置不同。 (例如,一个图书馆强制
/MD和/MDd,而另一个图书馆强制/MT和/MTd)
我们不确定处理这类事情的最佳方法是什么。我们讨论了以下选项:
- 围绕任何第三方依赖项构建我们自己的构建系统。
- 专业人士:我们知道一切都会匹配
- 专业人士:我们知道我们可以以正确的方式进行跨平台支持
- CON:我们不知道每个第三方构建系统是如何工作的
- CON:很多很多工作
- CON:如果第三方依赖项发生变化则中断
- 尝试使用第三方构建系统,并尝试修改它们来满足我们的需要。
- 专业版:似乎工作量更少
- CON:我们可能会破坏第三方系统
- CON:如果第三方依赖项发生变化则中断
- CON:迫使我们自己的构建变得非常复杂
我们不知道该怎么做;我们无法相信只有我们一个人遇到这些问题。我们应该选择上述选项之一,还是我没有想到的第三种选择?
【问题讨论】:
-
拥有自己的构建系统对我来说有点过分。如果您的程序对 crt(MD, MT, etc) 的使用保持不变,那么编辑 conf 工具的参数应该是一种不那么耗时的方法。因为您始终可以拥有原件的副本。
-
这些第三方代码是以什么形式提供的?动态链接库?还是对象?
-
@pizza:主要是来源。但通常部分构建脚本会生成配置标头和构建所需的其他类似内容。
-
如果这些第三方是必不可少的,如果你打算长期使用,最好自己构建构建系统。这将是很多工作,但您将对构建和维护这些第三方有更深入的了解,并且从长远来看会很有用。这就像你现在或以后再努力一样。只是我的2美分。 :)
-
没有依赖树很难量化。你有多少“钻石”(lib B 依赖于 lib A,lib C 依赖于 lib A,lib D 依赖于 lib B 和 lib C)?我倾向于坚持使用您的“主要”构建系统(msbuild?)并尝试创建模仿第 3 方构建系统所做的 makefile——如果它们有“非常冗长”的选项,那么做起来并不难
标签: c++ c dependencies build-dependencies