我在一个C++项目中的代码组织如下
My code in a C++ project is organised as follows
.cpp
和 .h
文件,其中包含我的类.cxx
文件,它们必须针对 .cpp
文件和一些外部库进行编译..cpp
and .h
files which contains my classes.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
.cpp
and .h
files, using add_library
.cxx
files and create an executable from each, using add_executable
and foreach
这可能很简单
file( GLOB LIB_SOURCES lib/*.cpp )
file( GLOB LIB_HEADERS lib/*.h )
add_library( YourLib ${LIB_SOURCES} ${LIB_HEADERS} )
只需循环遍历所有 .cpp 文件并创建单独的可执行文件.
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(全局...)
.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. find( GLOB ... )
. string( REPLACE ... )
. I could have used get_filename_component with the NAME_WE
flag.关于一般"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 中添加多个可执行文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!