Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 在多个子目录中使用相同的配置_Cmake - Fatal编程技术网

Cmake 在多个子目录中使用相同的配置

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项目,它有一堆子目录,所有子目录的编译方式基本相同(子目录本身就是独立的项目,它们只是具有相似的配置)。 根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_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_子目录”在子目录中编写二进制文件的行为,但如果您不需要,这只会使整个过程更简单!