【问题标题】:How do I produce only an object file (*.o) from a CMake build target?如何从 CMake 构建目标仅生成目标文件 (*.o)?
【发布时间】:2011-01-22 00:18:04
【问题描述】:

我正在尝试使用 CMake 构建目标文件,但我似乎无法让 CMake 构建除了完整可执行文件之外的其他内容。我基本上是在寻找以下编译的结果(结果将加载到 VxWorks 目标上并随后链接):

$(CC) $(CFLAGS) $(INC_DIRS) -c src/object.c

我已尝试更改目标的 OUTPUT_NAME 属性,但这似乎也无济于事。

我想我可以通过使用自定义命令来解决这个问题,但这似乎我也在解决 CMake 提供的好东西。

感谢您的帮助!

【问题讨论】:

  • 我想知道你为什么想要目标文件。不能用 CMake 构建静态库吗?如有必要,仅来自一个源文件的静态库?或者,您可以尝试链接可执行文件并“重用”生成的目标文件
  • @Andre 当您知道项目中的其他地方也存在编译错误时(例如,如果您与另一位开发人员在代码上密切合作,那么您可以努力修复单个文件的编译错误)尚未准备好用于一般消费),无需编辑CMakeLists.txt 文件。

标签: cmake build-process object-files


【解决方案1】:

这个答案是在CMake mailing list 中给我的,它就像一个魅力:

看看下面的${CMAKE_SOURCE_DIR}/cpo脚本:

#!/bin/sh
d=$1; shift
while [ "$1" != "--" ]; do
  cp $1 $d/$(basename $1); shift
done

现在,看看下面的 CMakeLists.txt:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(CPO C) 
FILE(WRITE ${CMAKE_BINARY_DIR}/f.c "void f(void){}\n")
ADD_LIBRARY(f SHARED f.c)
SET_TARGET_PROPERTIES(f PROPERTIES RULE_LAUNCH_LINK
  "${CMAKE_SOURCE_DIR}/cpo ${CMAKE_BINARY_DIR} <OBJECTS> --"
)

启动脚本“cpo”使目标“f”在 作为第一个参数传入的目录而不是库; 其他一切都应该照常营业。关键是脚本 访问&lt;OBJECTS&gt;占位符,因此可以对对象进行操作 文件,而忽略“--”之后的实际链接命令。那 方式,您可以使用 CMake 的所有功能进行编译和 在链接发生之​​前拦截。 IMO,这是一个相当干净的 应该很容易适应您的需求的解决方案;不足之处 是RULE_LAUNCH_LINK的使用仅限于Makefile生成器。

【讨论】:

  • 酷到只限于 Makefile 生成器的解决方案
【解决方案2】:

从 CMake 3.1 开始,CMake 已经能够创建Object libraries:

OBJECT 库类型定义了由编译给定源文件产生的目标文件的非归档集合。

创建目标文件(无库或可执行文件),请将此OBJECT 关键字与add_library() 命令一起使用:

# This will create object.c.o (or object.c.obj on Windows) when built.
add_library(MyObj OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/object.c)

您可以稍后引用要编译到其他库或可执行文件中的目标文件:

add_library(MyLibrary STATIC $<TARGET_OBJECTS:MyObj> MyClass1.cpp Helpers.cpp)

【讨论】:

  • 为什么add_library(MyLibrary STATIC MyObj MyClass1.cpp Helpers.cpp) 不起作用?
  • @einpoklum add_library 后面的 STATIC 关键字(或其他库类型关键字)的参数应该是 source 文件。因为MyObj 不是源文件,而是目标名称,所以我们必须通过TARGET_OBJECTS 引用它来告诉CMake 这种特殊情况。
  • 我误以为文件是构成目标。
【解决方案3】:

我会使用自定义命令路径。请记住,如果您设置了 GENERATED 和 EXTERNAL_OBJECT 源文件属性,您仍然可以使用这些目标文件与 CMake 一起编译。

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2011-08-22
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多