在CMake中添加多个可执行文件
我在C ++项目中的代码组织如下
- 我有几个
.cpp
和.h
文件,其中包含我的类 - 我有几个
.cxx
文件必须编译.cpp
文件和一些外部库。
现在,每个.cxx
文件都有一个main()
方法,因此我需要为与文件具有相同名称的每个文件添加一个不同的可执行文件。
此外,这些.cxx
文件可能无法链接到相同的外部库。
我想写这个版本的CMake,我是一个新手,我怎么去做呢?
我的build议是分两个阶段来处理:
- 使用
add_library
从.cpp
和.h
文件构build一个库 - 遍历所有的
.cxx
文件,并使用add_executable
和foreach
从每个文件创build一个可执行文件
build立图书馆
这可能是如此简单的事情
file( GLOB LIB_SOURCES lib/*.cpp ) file( GLOB LIB_HEADERS lib/*.h ) add_library( YourLib ${LIB_SOURCES} ${LIB_HEADERS} )
build立所有的可执行文件
简单地遍历所有.cpp文件并创build单独的可执行文件。
# If necessary, use the RELATIVE flag, otherwise each source file may be listed # with full pathname. RELATIVE may makes it easier to extract an executable name # automatically. # file( GLOB APP_SOURCES RELATIVE app/*.cxx ) file( GLOB APP_SOURCES app/*.cxx ) foreach( testsourcefile ${APP_SOURCES} ) # I used a simple string replace, to cut off .cpp. string( REPLACE ".cpp" "" testname ${testsourcefile} ) add_executable( ${testname} ${testsourcefile} ) # Make sure YourLib is linked to each app target_link_libraries( ${testname} YourLib ) endforeach( testsourcefile ${APP_SOURCES} )
一些警告:
- 通常不推荐使用
file( GLOB )
,因为如果添加新文件,CMake不会自动重build。 我在这里使用它,因为我不知道你的源文件。 - 在某些情况下,可能会以完整的path名称find源文件。 如有必要,请使用RELATIVE标志
find( GLOB ... )
。 - 手动设置源文件需要更改CMakeLists.txt,这会触发重build。 看到这个问题的(dis-)globbing的优点。
- 我使用
string( REPLACE ... )
。 我可以使用带有NAME_WE
标志的get_filename_component 。
关于“一般”CMake信息,我build议你阅读一些在这里已经问到的stackoverflow广泛的“CMake概述”的问题。 例如:
- CMake教程
- CMake的新手会想知道什么是尘土飞扬的angular落?