假设我的源代码具有以下目录结构:
C:USERSPCSOURCEREPOSmy_app_src
├───apps {a.hh, b.cc, c.hh, d.cc}
│ └───biosimulations {main1.hh, main1.cc, x.hh, y.cc}
└───core {w.cc, x.hh, y.hh, z.cc}
└───algorithms {p.hh, p.cc, q.hh, r.cc, s.hh, s.cc}
└───trees {r.hh, r.cc, main2.hh, main2.cc}
每个文件夹有任意数量的头文件和源文件,文件名也可以。
我如何为这个项目写一个CMakeList.txt
文件?
这是科学软件。
我需要能够使用同一库的不同部分来编译和构建多个应用程序的可执行文件。
例如,在上面的示例中,main1.exe
和main2.exe
应该是两个不同的可执行文件。
有时,我需要能够关闭编译一个或另一个可执行文件。
不,我不需要它们。我只需要能够编译和执行应用程序。您希望项目支持测试、安装和/或打包吗?
in core是什么?
模型类。例如:原子、蛋白质、链等
core
的源文件是单个库的一部分还是可执行文件?
可执行文件的一部分。项目中没有静态或动态库。
使用add_subdirectory和add_library命令,递归地将所有源文件添加到目录结构中。
cmake_minimum_required(VERSION 3.x)
project(my_app)
# Add subdirectories recursively
add_subdirectory(apps)
add_subdirectory(core)
add_subdirectory(simulations)
add_subdirectory(ui)
add_subdirectory(utils)
# Create the final executable
add_executable(my_app main.cpp)
# Link the libraries to the executable
target_link_libraries(my_app core simulations apps ui utils)
然后在每个子目录(apps,core,simulation,ui, utils)中,你需要添加一个新的CMakeLists.txt,告诉该目录下有哪些源文件,并创建一个库。
cmake_minimum_required(VERSION 3.x)
SET(SRC_FILES
program.cpp
)
#for static libraries
add_library(core STATIC ${SRC_FILES})
#for dynamically linking libraries
add_library(core SHARED ${SRC_FILES})
# If you need executable here
# add_executable(core ${SRC_FILES})
需要对所有子目录重复此操作,直到覆盖所有源目录。上面的例子给出了一般的结构,你需要根据需要定义CMAKE标志。