Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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创建仅页眉的库? 如何在CMASE中创建一个项目,将所有C++文件收集到一个头文件中?_C++_Cmake_Shared Libraries - Fatal编程技术网

如何使用cmake创建仅页眉的库? 如何在CMASE中创建一个项目,将所有C++文件收集到一个头文件中?

如何使用cmake创建仅页眉的库? 如何在CMASE中创建一个项目,将所有C++文件收集到一个头文件中?,c++,cmake,shared-libraries,C++,Cmake,Shared Libraries,我有这个项目结构 / project/ folder1/ file.cpp file.hpp folder2/ ...etc CMakeLists.txt tests/ test.cpp CMakeLists.txt CMakeList.txt 根目录cmakelists.txt cmake_minimum_required (VERSION 3.8) project ("CMak

我有这个项目结构

/
  project/
     folder1/
         file.cpp
         file.hpp
     folder2/
         ...etc
     CMakeLists.txt
  tests/
     test.cpp
     CMakeLists.txt
CMakeList.txt
根目录cmakelists.txt

cmake_minimum_required (VERSION 3.8)

project ("CMakeProject"
    LANGUAGES C CXX)

set(CMAKE_EXECUTABLE_SUFFIX ".exe")

include(GNUInstallDirs)

add_subdirectory ("project")


option(ENABLE_TESTING OFF)

if (ENABLE_TESTING)
    enable_testing()
    add_subdirectory("tests")
endif()
项目中的CMakeLists.txt

cmake_minimum_required (VERSION 3.8)

file(GLOB projectSRC
    "*/*.cpp"
    "*/*.hpp"
    "*.cpp"
    "*.hpp"
)

add_library(project INTERFACE)

message(STATUS "CMake inatall directory: " ${CMAKE_INSTALL_INCLUDEDIR})
target_include_directories(project 
    INTERFACE 
        $<BUILD_INTERFACE:${PROJECT_INCLUDE_DIR}>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
如何生成一个标题并使用它(在测试或其他项目中)或使此库能够具有模板?第一个更好

如何使用cmake创建仅页眉的库

像这样:

add_library(project INTERFACE)
target_include_directories(project INTERFACE .)
然后在使用库的目标中:

target_link_libraries(dependee
    PUBLIC/INTERFACE/PRIVATE # pick one
    project)
并包括如下标题:

#include <project/folder1/file.hpp>
#包括

如果您希望所有内容都包含在标题中,那么首先为什么要将内容放入.cpp文件中?这可能是不可能的。您可以定义单个cpp文件的局部变量,如果您这样做了,那么如果多个cpp文件定义同一个变量,您可能会重新定义某些变量。如果这很重要,我可以将标题中的所有内容移动,但不能移动到一个标题中。我个人从未尝试过这样做。但是,您可以在github上检查执行此操作的开源项目。你可以从他们的项目中得到很好的指导。我知道2,有pybind11和catch2是只头文件的库。这里有一个很好的逐行解释参考:我发现在目标链接库中,如果只头文件的库是接口,那么在构建项目时,cmake不会检测库的头文件。严格地说,目标目录中“.”的作用域是否应该是公共的,而不是接口?从技术上讲,该目录中的文件包括该目录中的其他文件。我明白,实际上,这没有什么区别,因为你永远不会真正建立这个项目。我想,如果您添加了一个实现文件并将库更改为PUBLIC(仅限非标题),那么您可以少做一次更改。@ToddR如果库是“接口”,则该关键字只能是“接口”。
#include <project/folder1/file.hpp>