【问题标题】:CMake: How to create one object from several source files?CMake:如何从多个源文件创建一个对象?
【发布时间】: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 时,仅指定打算构建的文件,并省略不应单独构建的文件。

标签: c cmake


【解决方案1】:

不确定它是否能回答您的问题,但通常使用以下 CMake 代码 sn-p 来收集文件并构建库:

# Collect files
# 
file(GLOB_RECURSE SOURCE_C ${YOUR_PROJECT_SRC_DIR}/ *.c)
file(GLOB_RECURSE SOURCE_H ${YOUR_PROJECT_HEADER_DIR}/ *.h)

# Add library target with its dependencies
#
add_library(YOUR_LIB_NAME ${SOURCE_C} ${SOURCE_H})

这不是最佳做法,因为如果您添加一个文件,生成的 Makefile 将不会检测到这一点,您必须重新运行 cmake 以将其考虑在内。

【讨论】:

  • 很遗憾,这不起作用,因为它编译了只能包含到对象中的*.c 文件,但失败了。
【解决方案2】:

如 cmets 中所述,每个编译单元始终有一个对象,因此解决方案是确保在 add_library 中仅使用包含图中的顶级文件。然后它们是唯一要编译为对象并链接到库的文件。 CMake 有希望自己找出对包含文件的依赖关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多