CMake:如何让子目录使用根目录中的源文件

时间:2013-05-06 21:24:09

标签: cmake

我在根CMakeLists.txt中设置了这个变量

set(${LIBNAME}_srcs
File1.cpp
File2.cpp
File3.cpp
File4.cpp
File5.cpp
)
add_subdirectory(A)

我想在子目录A

中添加变量作为可执行文件的源
add_executable(${TEST}}

最干净的方法是什么?无需在所有源文件上使用../创建新变量?或者我有可以使用的宏吗?

2 个答案:

答案 0 :(得分:2)

您可以通过执行以下操作,在${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})

答案 1 :(得分:0)

当我添加源代码时,我会这样做:

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会自动将父目录的范围导入子目录。