【发布时间】:2017-12-19 19:32:24
【问题描述】:
要使用 CMake 构建一些 C 库,我需要从多个 C 源文件构建 一个 对象(在构建静态库时)。当使用add_library 时,CMake 将为 each 源文件创建一个对象。 (在这种情况下会失败,因为 *.c 文件包含其他无法作为对象单独构建的 *.c 文件,因为某些定义会丢失。)
在 Make 这看起来像这样
file.o: file_part1.c file_part2.c
有没有办法强制add_library 只从所有 C 文件中构建一个对象?
【问题讨论】:
-
静态库只不过是目标文件的存档,没有链接阶段,因此不会因缺少符号而出现任何错误。如果有的话,您是否应该将源文件包含到其他源文件中。如果您这样做,则说明您的项目设置有问题。
-
至于您的“解决方案”,不,不可能从多个源文件创建单个目标文件。一个目标文件代表一个translation unit,这是构建一个包含所有标头的单个源文件的结果。 “组合”目标文件的标准方法是通过静态库。
-
> 静态库只不过是目标文件的存档,没有链接阶段,因此不会因缺少符号而出现任何错误。错误是在链接之前,因为一些使用的类型没有定义。 > 如果有的话,您是否应该将源文件包含到其他源文件中。如果您这样做,则您的项目设置有问题。不幸的是,这不是我的选择,这是我想要使用的库中所做的。 (他们将其用作某种形式的单态化以减少代码冗余。)
-
您是在谈论“.lib”或“.a”静态库文件还是“.obj”或“.o”文件。如果是前者,我们可以帮你,如果是后者,你就错了。
-
您能否举例说明您拥有什么以及您想要实现什么?
This fails in this case, because the '*.c' files are including other '*.c' files that cannot be build individually as an object- 调用add_library时,仅指定打算构建的文件,并省略不应单独构建的文件。