为什么在并行文件夹CMake中找不到文件?



为了让我的。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

[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_librarytarget_link_libraries在这里是否真的有意义,因为我不想创建自己的库,只是想整理一下我的文件,等待他们的主题。

myProject似乎不是您设置的变量。此外,如果您正确地设置了库目标,则不需要手动将任何包含目录添加到myProject中。

首先为math设置CMakeLists.txt文件,因为它不依赖于其他项目。我建议将链接库的头文件移动到子目录中。我自己通常使用include,您希望链接库在#include中使用的任何路径都从那里开始。设置包含目录,将它们添加到mathINTERFACE_INCLUDE_DIRECTORIEStarget属性中。

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)

最新更新