我在根 CMakeLists.txt 中设置了这个变量
set(${LIBNAME}_srcs
File1.cpp
File2.cpp
File3.cpp
File4.cpp
File5.cpp
)
add_subdirectory(A)
我想将变量添加为子目录 A 中可执行文件的源
add_executable(${TEST}}
最干净的方法是什么?无需在所有源文件上使用 ../ 创建新变量?或者有我可以使用的宏吗?
我在根 CMakeLists.txt 中设置了这个变量
set(${LIBNAME}_srcs
File1.cpp
File2.cpp
File3.cpp
File4.cpp
File5.cpp
)
add_subdirectory(A)
我想将变量添加为子目录 A 中可执行文件的源
add_executable(${TEST}}
最干净的方法是什么?无需在所有源文件上使用 ../ 创建新变量?或者有我可以使用的宏吗?
您可以通过执行以下操作插入每个值的绝对路径${LIBNAME}_srcs
:
foreach(${LIBNAME}_src ${${LIBNAME}_srcs})
list(APPEND abs_${LIBNAME}_srcs ${CMAKE_SOURCE_DIR}/${${LIBNAME}_src})
endforeach()
add_executable(${TEST} ${abs_${LIBNAME}_srcs})
在这里草草下结论,看起来你正在做的事情可能有点不寻常。
通常,add_executable
调用将在收集源文件列表的同一位置进行 - 通常在同一目录中。
根据您已将源变量命名为事实${LIBNAME}_srcs
,我猜您已经从这些源中创建了一个库。如果是这样,最好将该库链接到您的测试子目录中,而不是将所有库的源重新编译到可执行文件中。
就像是:
add_executable(${TEST} test_main.cpp)
target_link_libraries(${TEST} ${LIBNAME})
当我添加来源时,我会这样做:
set(${LIBNAME}_srcs
${SRC}/File1.cpp
${SRC}/File2.cpp
${SRC}/File3.cpp
${SRC}/File4.cpp
${SRC}/File5.cpp
)
使用. ${SRC}
找到的源目录的绝对路径在哪里?${CMAKE_SOURCE_DIR}
然后,您可以简单地add_executable(${TEST} ${LIBNAME}_srcs)
在您的子目录中使用。CMake 会自动将父目录的作用域导入到子目录中。