【发布时间】:2018-08-23 14:38:00
【问题描述】:
我正在尝试让 cmake(在 linux 上)创建一些静态对象 (.o) 文件并将它们安装到外部目录。为此,我有一个列表object_sources,其中包含源的项目路径,并将其放在顶层CMakeLists.txt:
set(local_objects "")
foreach(file ${object_sources})
get_filename_component(cur ${file} NAME_WE)
add_library("${cur}.o" OBJECT ${file})
list(APPEND local_objects "${cur}.o")
# To confirm these variables are what I think they are:
message("---> ${cur} | ${file}")
endforeach()
install(
# Also tried FILES, see below.
TARGETS ${local_objects}
CONFIGURATIONS Debug
# Also tried nothing instead of 'OBJECTS' (same outcome)
# and LIBRARY (cmake fails on error).
OBJECTS
DESTINATION "/some/external/dir"
)
关于使用FILES,它无法工作,因为实际上从未创建过foo.o,所以我没有必要尝试获得正确的项目路径。
当我在 cmake 构建目录中找到实际的 make 命令时,它会在此过程中吐出 Built target foo.o 等。然而,如前所述,在任何地方都没有创建过foo.o,install 在/some/external/dir 中创建了一个objects-Debug 目录,其中包含使用其名称(例如foo.o/)的每个目标的目录,并且在其中还有一些嵌套的目录底部的目录是我想要的对象,名称错误:foo.cpp.o。
Cmake 可以随心所欲地构建它的构建树并命名它的临时对象,但我真的很想能够要求最终产品对象foo.o(不是foo.cpp.o)并以这种方式安装它.
这可能吗?我开始认为这完全违背了 cmake 的(隐式)目的,我应该将这些类型的任务单独保存在 shell 脚本或 makefile 中(其中任何一个都需要大约三行),并且只使用 cmake用于规范的库和可执行文件。
或者:如果我将每个对象创建为静态存档 (lib.a),我相信我可以让它工作,但这里的部分问题是需要修改其他东西的构建脚本,或者提取他们通过脚本(在这种情况下,我不妨在脚本中完成整个事情)。
【问题讨论】: