问题描述
我在一个C++项目中的代码组织如下
My code in a C++ project is organised as follows
- 我有几个
.cpp
和.h
文件,其中包含我的类 - 我有几个
.cxx
文件,它们必须针对.cpp
文件和一些外部库进行编译.
- I have several
.cpp
and.h
files which contains my classes - I have several
.cxx
files which have to be compiled against the.cpp
files and some external libraries.
现在,每个 .cxx
文件都有一个 main()
方法,所以我需要为每个与文件.
Now, each of the .cxx
files have a main()
method, so I need to add a different executable for each of these files having the same name as the file.
此外,这些 .cxx
文件可能不会链接到相同的外部库.
Also, these .cxx
files might not get linked to the same external libraries.
我想在 CMake 中编写这个构建,我是一个新手,我该怎么做?
I want to write this build in CMake, in which I am kind of a newbie, how do I go about this?
推荐答案
我的建议是分两个阶段解决这个问题:
My suggestion is to tackle this in two phases:
- 从
.cpp
和.h
文件构建一个库,使用add_library
- 遍历所有
.cxx
文件并使用add_executable
和foreach
- Build a library from the
.cpp
and.h
files, usingadd_library
- Iterate through all your
.cxx
files and create an executable from each, usingadd_executable
andforeach
构建库
这可能很简单
file( GLOB LIB_SOURCES lib/*.cpp )
file( GLOB LIB_HEADERS lib/*.h )
add_library( YourLib ${LIB_SOURCES} ${LIB_HEADERS} )
构建所有可执行文件
只需循环遍历所有 .cpp 文件并创建单独的可执行文件.
Build all the executables
Simply loop over all the .cpp files and create separate executables.
# 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 不会自动重建.我在这里使用它,因为我不知道你的源文件.- 在某些情况下,可能会找到带有完整路径名的源文件.如有必要,请为
find(全局...)
. - 手动设置源文件需要更改 CMakeLists.txt,这会触发重建.请参阅这个问题,了解通配的 (dis-) 优势.
- 我使用
string( REPLACE ... )
生成了测试名称.我可以使用 get_filename_component 和NAME_WE
标志. file( GLOB )
is usually not recommended, because CMake will not automatically rebuild if a new file is added. I used it here, because I do not know your sourcefiles.- In some situations, source-files may be found with a full pathname. If necessary, use the RELATIVE flag for
find( GLOB ... )
. - Manually setting the source-files requires a change to CMakeLists.txt, which triggers a rebuild. See this question for the (dis-)advantages of globbing.
- I generated the testname using a
string( REPLACE ... )
. I could have used get_filename_component with theNAME_WE
flag. - CMake 教程
- 什么是CMake 新手会想知道的尘土飞扬的角落吗?
Some warnings:
关于一般"CMake 信息,我建议您阅读一些已在 stackoverflow 上提出的广泛的CMake 概述"问题.例如:
Concerning "general" CMake info, I advise you to read some of the broad "CMake Overview" questions already asked here on stackoverflow. E.g.:
这篇关于在 CMake 中添加多个可执行文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!