我正在使用cmake在C ++中构建我的项目。假设我的源文件夹
上有以下目录Source
|_Dir1
| |_Class.cpp
| |_Class.hpp
|
|_Dir2
|_Main.cpp
在Dir1中有一个包含其头文件和实现文件的类(Class.cpp和Class.hpp)。
在Dir2中,主要应用程序使用Dir1中的类
告诉Dir2中的CMakeLists使用Dir1 / Class.cpp文件构建可执行文件的好方法是什么?
编辑:更具体地说,我想定义Class.cpp的源文件必须在Dir1的CMakeLists.txt中使用,而不是在Dir2中使用。以另一种方式这样做对我来说是完全错误的并且很难使用,所以如果有理由他们强迫我这样做,那么对这个主题的一些澄清就会很好。
我目前正在做的是对Dir2 / CMakeLists.txt中的Class.cpp文件位置进行硬编码,但是当我有一堆类在一起进行交互时,它就无法扩展。
答案 0 :(得分:15)
假设您在CMakeLists.txt
目录中有一个Source
文件,您将使用不同的file()
命令创建两个变量
file(GLOB Dir1_Sources RELATIVE "Dir1" "*.cpp")
file(GLOB Dir2_Sources RELATIVE "Dir2" "*.cpp")
并将file()
命令生成的两个集合添加到目标的源列表中:
add_executable(MyProgram ${Dir1_Sources} ${Dir2_Sources})
或者,您可以在CMakeLists.txt
和Dir1
(主要)下方放置Dir2
文件,如下所示
Source
|
|_ CMakeLists.txt
| > project(MyProgram)
| > cmake_minimum_required(VERSION 3.8)
| > add_subdirectory("Dir1")
| > add_subdirectory("Dir2")
|
|_ Dir1
| |_ CMakeLists.txt
| > file(GLOB Sources "*.cpp")
| > add_library(Dir1 STATIC ${Sources})
|_ Dir2
|_ CMakeLists.txt
> file(GLOB Sources "*.cpp")
> add_executable(MyProgram ${Sources})
> target_link_libraries(MyProgram Dir1)
将子目录添加为链接到主目标的其他(静态)库。