Cmake 在多个子目录中使用相同的配置
我有一个cmake项目,它有一堆子目录,所有子目录的编译方式基本相同(子目录本身就是独立的项目,它们只是具有相似的配置)。 根CMakeLists.txt类似于:Cmake 在多个子目录中使用相同的配置,cmake,Cmake,我有一个cmake项目,它有一堆子目录,所有子目录的编译方式基本相同(子目录本身就是独立的项目,它们只是具有相似的配置)。 根CMakeLists.txt类似于: cmake_minimum_required(VERSION 2.8) set(CMAKE_TOOLCHAIN_FILE "/path/to/arm-toolchain.cmake") project(Examples) set(CMAKE_BUILD_TYPE Debug) set(CMAKE_CXX_FLAGS "${CMAK
cmake_minimum_required(VERSION 2.8)
set(CMAKE_TOOLCHAIN_FILE "/path/to/arm-toolchain.cmake")
project(Examples)
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error")
include_directories("path/to/include")
link_directories("path/to/lib")
add_subdirectory(Foo)
add_subdirectory(Bar)
add_subdirectory(Bob)
add_subdirectory(Encoder)
# Use subdirectory name for executable name.
get_filename_component(OutName ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" OutName ${OutName})
file(GLOB Source "src/*.cpp")
add_executable(${OutName} ${Source})
target_link_libraries(${OutName} libtolink)
在每个子目录中,我都有一个CMakeLists.txt,类似于:
cmake_minimum_required(VERSION 2.8)
set(CMAKE_TOOLCHAIN_FILE "/path/to/arm-toolchain.cmake")
project(Examples)
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error")
include_directories("path/to/include")
link_directories("path/to/lib")
add_subdirectory(Foo)
add_subdirectory(Bar)
add_subdirectory(Bob)
add_subdirectory(Encoder)
# Use subdirectory name for executable name.
get_filename_component(OutName ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" OutName ${OutName})
file(GLOB Source "src/*.cpp")
add_executable(${OutName} ${Source})
target_link_libraries(${OutName} libtolink)
并且每个子目录的子目录CMakeLists.txt的内容都是相同的。在cmake中是否有任何方法可以避免为每个子目录复制CMakeLists.txt?您可以在父CMakeLists.txt文件中声明一个函数:
function(subproject subdir)
# Use subdirectory name for executable name.
get_filename_component(OutName ${subdir} NAME)
string(REPLACE " " "_" OutName ${OutName})
file(GLOB Source "${CMAKE_CURRENT_SOURCE_DIR}/${subdir}/src/*.cpp")
add_executable(${OutName} ${Source})
target_link_libraries(${OutName} libtolink)
set_property(
TARGET ${OutName}
PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${subdir}"
) # write the compiled program in the subdirectory
endfunction()
并为每个子项目调用它,而不是add_子目录
:
subproject(Foo)
subproject(Bar)
subproject(Bob)
subproject(Encoder)
成功了;起初我没有意识到我不再需要在每个子目录上调用add_子目录,我个人评论了set_属性(TARGET……行,因为我不想要/需要它,但除了那些你不知道是否有效的怪癖之外。是的,我试着模仿“add_子目录”在子目录中编写二进制文件的行为,但如果您不需要,这只会使整个过程更简单!