如何从CMake构建目标中仅生成目标文件(* .o)?

时间:2011-01-22 00:18:04

标签: build-process cmake

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

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

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

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:6)

我在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”生成目标文件 作为第一个参数而不是库传入的目录; 其他一切都应该像往常一样。关键是剧本 访问<OBJECTS>占位符,以便它可以对该对象进行操作 文件,而忽略“ - ”后面的实际链接命令。那 方式,你可以使用所有CMake的功能进行编译和 在链接发生之​​前拦截。 IMO,这很干净 解决方案应该很容易适应您的需求;不足之处 是RULE_LAUNCH_LINK的使用仅限于Makefile生成器。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

从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)