如何使用CMake在特定目录中收集目标文件(.o)?

时间:2018-06-04 16:24:02

标签: cmake

CMake在编译源文件时隐式设置目标文件的目录,但我想将所有这些目标文件保存在特定目录中。

例如在我的代码中,CMake正在创建基于源代码目录本身的目录,如下所示:

CMakeFiles/OBJ2.dir/src/lib/kernels/XnnKernel.o

我希望将它们保存在不同的位置,但无法这样做。

我尝试了一些命令:

set(OBJ "build/CMakeFiles/OBJ1.dir/src/lib/kernels/igemm8_generic.o")
file(COPY ${OBJ} DESTINATION ${SOURCE_PATH}/src/OBJ_FILES)

根据我的理解,file(COPY)命令在编译之前执行。如果我错了,请纠正我,并给我一个解决方案。

1 个答案:

答案 0 :(得分:0)

您可以将generator表达式与custom命令结合使用。基本功能基于创建object库的CMake功能。

项目结构:

.
├── CMakeLists.txt
└── src
    └── foo.c

样本CMakeLists.txt

cmake_minimum_required(VERSION 3.11)

project(foo C)

set(SOURCES "src/foo.c")

set(LIBNAME "foo")
set(LIBNAME_OBJ "${LIBNAME}_obj")

add_library(${LIBNAME_OBJ} OBJECT ${SOURCES})

target_include_directories(${LIBNAME_OBJ} PUBLIC "include")
target_compile_options(${LIBNAME_OBJ} PUBLIC "-fPIC")

add_library(${LIBNAME} SHARED $<TARGET_OBJECTS:${LIBNAME_OBJ}>)

set(OBJ_DIR ${CMAKE_CURRENT_BINARY_DIR}/obj_dir)

add_custom_command(TARGET ${LIBNAME}
  POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E make_directory ${OBJ_DIR}
  COMMAND ${CMAKE_COMMAND} -E copy_if_different 
  $<TARGET_OBJECTS:${LIBNAME_OBJ}> ${OBJ_DIR})

file命令不支持带有文件系统操作的生成器表达式。