库标题在标题中不可见,但在cmake build下的.cpp文件中完全可见。为什么? 我有一个C++项目,包含几个模块,一些构建为库,具有这样的结构: /MyProject +---/build /ModuleA +---CMakeLists.txt <- module level CMakeLists +---/src | +--CMakeLists.txt <- src level CMakeLists | +--FileA1.cpp | +--FileA2.cpp +---/include | +--FileA1.h | +--FileA2.h | +--FileA3.h /ModuleB +---CMakeLists.txt +---/src | +--CMakeLists.txt | +--FileB1.cpp | +--FileB2.cpp +---/include | +--FileB1.h | +--FileB2.h | +--FileB3.h main.cpp CMakeLists.txt <- project level CMakeLists
模块级:库标题在标题中不可见,但在cmake build下的.cpp文件中完全可见。为什么? 我有一个C++项目,包含几个模块,一些构建为库,具有这样的结构: /MyProject +---/build /ModuleA +---CMakeLists.txt <- module level CMakeLists +---/src | +--CMakeLists.txt <- src level CMakeLists | +--FileA1.cpp | +--FileA2.cpp +---/include | +--FileA1.h | +--FileA2.h | +--FileA3.h /ModuleB +---CMakeLists.txt +---/src | +--CMakeLists.txt | +--FileB1.cpp | +--FileB2.cpp +---/include | +--FileB1.h | +--FileB2.h | +--FileB3.h main.cpp CMakeLists.txt <- project level CMakeLists,c++,cmake,C++,Cmake,模块级: subdirs(src) src级别: FIND_PACKAGE(SomePackage REQUIRED) INCLUDE_DIRECTORIES( ${SomePackage_INCLUDE_DIR} ${MyProject_SOURCE_DIR}/ModuleA/include ) SET(SOURCE_FILES <all files from ModuleA/src goes here>) ADD_LIBRARY(
subdirs(src)
src级别:
FIND_PACKAGE(SomePackage REQUIRED)
INCLUDE_DIRECTORIES(
${SomePackage_INCLUDE_DIR}
${MyProject_SOURCE_DIR}/ModuleA/include
)
SET(SOURCE_FILES <all files from ModuleA/src goes here>)
ADD_LIBRARY(ModuleA STATIC ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(ModuleA
${SomePackage_LIBRARIES}
)
FIND_包(需要一些包)
包含目录(
${SomePackage\u INCLUDE\u DIR}
${MyProject\u SOURCE\u DIR}/ModuleA/include
)
设置(源文件)
添加_库(ModuleA STATIC${SOURCE_FILES})
目标链接库(模块a)
${SomePackage_LIBRARIES}
)
问题是:当我在ModuleA头文件(即FileA1.h中的SomePackageFile.hpp)中包含来自“SomePackage”的头文件时,我在使用make运行生成时出错:
致命错误:SomePackageFile.hpp:没有此类文件或目录
当我将它们包含在cpp文件中时,它们是可见的,并且项目编译正确。我认为src级别的CMakeLists有问题,或者整个文件层次结构缺少某些内容。我有一个github项目,可以用作其他项目的框架: 如果遵循此布局,则不需要将${SomePackage\u INCLUDE\u DIR}添加到INCLUDE\u目录,否则这不是将目录添加到INCLUDE路径的最佳方法 简而言之,您应该定义一个新库,如下所示:
project(module_a)
set(sources
src/source_a_1.cc
)
add_library(library_a
${sources}
)
target_include_directories(library_a
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
#include "<module>/<module_header.h>"
项目(模块a)
设置(源)
src/source_a_1.cc
)
添加库(库)
${sources}
)
目标目录包括目录(库目录)
公开的
$
$
)
然后,如果您定义了另一个库(library_b),则只需在目标链接库中添加library_a:
project(module_b)
# set list of sources, needs to be extended when new source arrives
set(sources
src/source_b_1.cc
)
# define a library (static by default -> liblibrary_b.a or library_a.lib will be generated)
add_library(library_b
${sources}
)
# include directories
target_include_directories(library_b
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
# link library_b
target_link_libraries(library_b
library_a
)
项目(模块b)
#设置源列表,新源到达时需要扩展
设置(源)
src/source_b_1.cc
)
#定义库(默认为静态->将生成liblibrary\u b.a或library\u a.lib)
添加库(库)
${sources}
)
#包括目录
目标目录包括目录(库目录
公开的
$
$
)
#链接库
目标链接库(库)
图书馆
)
请注意,在此源代码树中,所有头文件都位于
<module>/include/<module>
/include/
通过这种方式,您将包括来自的头文件,如下所示:
project(module_a)
set(sources
src/source_a_1.cc
)
add_library(library_a
${sources}
)
target_include_directories(library_a
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
#include "<module>/<module_header.h>"
#包括“/”
这只是因为/include将位于include路径上 我有一个github项目要用作其他项目的框架: 如果遵循此布局,则不需要将${SomePackage\u INCLUDE\u DIR}添加到INCLUDE\u目录,否则这不是将目录添加到INCLUDE路径的最佳方法 简而言之,您应该定义一个新库,如下所示:
project(module_a)
set(sources
src/source_a_1.cc
)
add_library(library_a
${sources}
)
target_include_directories(library_a
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
#include "<module>/<module_header.h>"
项目(模块a)
设置(源)
src/source_a_1.cc
)
添加库(库)
${sources}
)
目标目录包括目录(库目录)
公开的
$
$
)
然后,如果您定义了另一个库(library_b),则只需在目标链接库中添加library_a:
project(module_b)
# set list of sources, needs to be extended when new source arrives
set(sources
src/source_b_1.cc
)
# define a library (static by default -> liblibrary_b.a or library_a.lib will be generated)
add_library(library_b
${sources}
)
# include directories
target_include_directories(library_b
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
# link library_b
target_link_libraries(library_b
library_a
)
项目(模块b)
#设置源列表,新源到达时需要扩展
设置(源)
src/source_b_1.cc
)
#定义库(默认为静态->将生成liblibrary\u b.a或library\u a.lib)
添加库(库)
${sources}
)
#包括目录
目标目录包括目录(库目录
公开的
$
$
)
#链接库
目标链接库(库)
图书馆
)
请注意,在此源代码树中,所有头文件都位于
<module>/include/<module>
/include/
通过这种方式,您将包括来自的头文件,如下所示:
project(module_a)
set(sources
src/source_a_1.cc
)
add_library(library_a
${sources}
)
target_include_directories(library_a
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
#include "<module>/<module_header.h>"
#包括“/”
这只是因为/include将位于include路径上 如果从INCLUDE_DIRECTORIES()切换到TARGET_INCLUDE_DIRECTORIES(),则不需要更改项目的结构 如果从INCLUDE_DIRECTORIES()切换到TARGET_INCLUDE_DIRECTORIES(),则不需要更改项目的结构
当我在ModuleA头文件中包含来自“SomePackage”的头文件时
-ModuleA头文件不是独立编译的。它们作为某个源文件的一部分进行编译,该源文件属于库或可执行文件。我猜您正在将FileA1.h
包含到项目的main.cpp
中。注意,项目的可执行文件没有看到为模块添加的include目录。(命令include_directories()
不影响父目录。)当我在ModuleA头文件中包含来自“SomePackage”的头文件时,ModuleA头文件不是独立编译的。它们作为某个源文件的一部分进行编译,该源文件属于库或可执行文件。我猜您正在将FileA1.h
包含到项目的main.cpp
中。注意,项目的可执行文件没有看到为模块添加的include目录。(命令include_directories()
对父目录没有影响。)使用目标目录(),就是这样,谢谢你的提示。使用目标目录(),就是这样,谢谢你的提示。