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)
命令在编译之前执行。如果我错了,请纠正我,并给我一个解决方案。
答案 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
命令不支持带有文件系统操作的生成器表达式。