为了让我的。cpp和。h文件根据各自的职责进行排序,我决定将它们放入单独的文件夹中我使用了以下结构:
根
|
-CMakeLists.txt [rootCmakeList]
src
|
-main.cpp
.......|
.......<数学strong>
.......|
.......- CMakeLists.txt [mathCmakeList]
.......- Algebra.h
.......- Algebra.cpp
.......<</strong strong> XML>[xmlCmakeList]
.......|
.......- CMakeLists.txt
.......- AwesomeXML.h
.......- AwesomeXML.cpp
数学strong>
[rootCmakeList]看起来:
cmake_minimum_required(VERSION 3.11.3)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS_DEBUG "-g")
project(myProject)
#add exectuable
add_executable(myProject src/main.cpp)
target_include_directories(myProject PUBLIC "${src/XML}")
target_include_directories(myProject PUBLIC "${src/math}")
add_subdirectory(src/XML)
add_subdirectory(src/math)
target_link_libraries(myProject xml)#needed?
target_link_libraries(myProject math)#needed?
[mathCmakeList]看起来:
include_directories(${myProject}src/math)
add_library(math Algebra.cpp)
[xmlCmakeList]看起来:
include_directories(${myProject}src/xml)
add_library(xml AwesomeXML.cpp)
到目前为止一切顺利,没有问题。但是如果我想把代数我找不到文件了
说实话,我甚至不确定cmake命令add_library和target_link_libraries在这里是否真的有意义,因为我不想创建自己的库,只是想整理一下我的文件,等待他们的主题。
myProject
似乎不是您设置的变量。此外,如果您正确地设置了库目标,则不需要手动将任何包含目录添加到myProject中。
首先为math
设置CMakeLists.txt
文件,因为它不依赖于其他项目。我建议将链接库的头文件移动到子目录中。我自己通常使用include
,您希望链接库在#include
中使用的任何路径都从那里开始。设置包含目录,将它们添加到math
的INTERFACE_INCLUDE_DIRECTORIES
target属性中。
add_library(math Algebra.cpp
include/Algebra.h # for IDEs
)
target_include_directories(math # should be static here, since you don't want to deploy the lib by itself
PUBLIC include # available to both math and linking libs
PRIVATE . # only available to math; only necessary, if there are "private" headers
)
然后对xml
做同样的事情,但是因为你使用的是math
的功能,你需要链接它,让你自动访问它的包含目录,因为它们可以通过INTERFACE_INCLUDE_DIRECTORIES
获得:
add_library(xml STATIC
AwesomeXML.cpp
include/AwesomeXML.h
)
target_include_directories(xml PUBLIC include)
target_link_libraries(xml PRIVATE math) # change PRIVATE to PUBLIC, if Algebra.h is included in a public header
现在在顶层,我们应该确保在定义目标之前,目标的任何依赖项都是可用的。此外,链接一个库可以让你访问它们各自的公共包含目录,以及公共链接的依赖的公共包含目录:
cmake_minimum_required(VERSION 3.11.3)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS_DEBUG "-g")
project(myProject)
add_subdirectory(src/math)
add_subdirectory(src/XML)
#add exectuable
add_executable(myProject src/main.cpp)
target_link_libraries(myProject PRIVATE math xml)