Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
库标题在标题中不可见,但在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 - Fatal编程技术网

库标题在标题中不可见,但在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()
对父目录没有影响。)使用目标目录(),就是这样,谢谢你的提示。使用目标目录(),就是这样,谢谢你的提示。