Multiple source directories for one executable with CMake

北城以北 提交于 2019-12-08 22:31:14

问题


I want my source organised in a number of subdirectories but be able to create a single executable without having to build a library for each subdirectory. Can CMake do this? Something like:

ADD_EXECUTABLE(foo a/main.cpp a/other.cpp b/another.cpp)

Is it that simple? With the / working as a directory separator regardless of platform?


回答1:


Here the my simple example

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(foo CXX)
# get all *.cpp files recursively
file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/*.cpp)
add_executable(foo ${SRC_FILES})



回答2:


Another (arguably better for big code bases) variant is to use a separate CMakeLists.txt for each sub-directory where you isolate adding sources of the directory to a target using target_sources and maybe some particular configuration settings \ include conditions for those sources:

target_sources( SomeExeOrLib PRIVATE source1.h source1.cpp )

here you also have more control of the scope by specifying PRIVATE, other options are INTERFACE or PUBLIC. See details here: https://cmake.org/cmake/help/v3.3/command/target_sources.html




回答3:


Yes, that would work.

Update: What follows is not very relevant anymore because nowadays CMake supports response files, so there shouldn't be problems with too long command lines.

However you might have troubles when the number of files get too high, and the command line too long for your compiler to be able to handle it. A possible solution is to add a static library for each subdirectory, add them to a list "ALL_MY_SUB_LIBS", and link them to the main target foo in this way:

target_link_libraries(foo "-Wl,--whole-archive") #like opening a parenthesis
target_link_libraries(foo ${ALL_MY_SUB_LIBS}) 
target_link_libraries(foo "-Wl,--no-whole-archive") #like closing a parenthesis

ld linker question: the --whole-archive option



来源:https://stackoverflow.com/questions/17934024/multiple-source-directories-for-one-executable-with-cmake

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!