我正在尝试使用 CMake 构建一个目标文件,但我似乎无法让 CMake 构建一个完整的可执行文件以外的东西。我基本上是在寻找以下编译的结果(结果将加载到 VxWorks 目标上并随后链接):
$(CC) $(CFLAGS) $(INC_DIRS) -c src/object.c
我试过改变OUTPUT_NAME
目标的属性,但这似乎也无济于事。
我想我可以通过使用自定义命令来解决这个问题,但这似乎我也在解决 CMake 提供的好东西。
谢谢你的帮助!
我正在尝试使用 CMake 构建一个目标文件,但我似乎无法让 CMake 构建一个完整的可执行文件以外的东西。我基本上是在寻找以下编译的结果(结果将加载到 VxWorks 目标上并随后链接):
$(CC) $(CFLAGS) $(INC_DIRS) -c src/object.c
我试过改变OUTPUT_NAME
目标的属性,但这似乎也无济于事。
我想我可以通过使用自定义命令来解决这个问题,但这似乎我也在解决 CMake 提供的好东西。
谢谢你的帮助!
这个答案是在CMake 邮件列表中给我的,它就像一个魅力:
看下面的${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
发电机。
从 CMake 3.1 开始,CMake 已经能够创建对象库:
库
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)
我会去自定义命令路径。请记住,如果您设置 GENERATED 和 EXTERNAL_OBJECT 源文件属性,您仍然可以使用这些目标文件与 CMake 一起编译。