C++ 在CMake中包含带有库的标题

C++ 在CMake中包含带有库的标题,c++,cmake,C++,Cmake,我的项目中有两个实用程序库。我正在寻找为库编写CMake配置的最佳方法 /my_project --> CMakeLists.txt --> main.cpp --> /utils --> CMakeLists.txt --> common.h --> /base_c --> CMakeLists.txt --> base_c.c -->

我的项目中有两个实用程序库。我正在寻找为库编写CMake配置的最佳方法

/my_project
 --> CMakeLists.txt
 --> main.cpp
 --> /utils
      --> CMakeLists.txt
      --> common.h
      --> /base_c
           --> CMakeLists.txt
           --> base_c.c
           --> base_c.h
      --> /base_cpp
           --> CMakeLists.txt
           --> base_cpp.cpp
           --> base_cpp.hpp
我当前的CMake文件:

/my_项目/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR})
cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)
/my_项目/utils/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR})
cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)
/my_project/utils/base_c/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR})
cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)
/我的项目/utils/base\u cpp/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR})
cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)
问题是
base\u cpp
没有从
base\u c
中找到包含项。我应该如何修复配置


我设法使它与
target\u include\u目录(base\u cpp PRIVATE../base\u c)
一起工作,但这很难看,而且不应该是必需的,据介绍。

target\u include\u目录)
是您正在寻找的,但不是
PRIVATE
选项

根据
PRIVATE
选项仅适用于该目标中使用的目录,
INTERFACE
仅适用于从属目标使用的目录,
PUBLIC
同时适用于两者

我建议在/my_project/utils/base_c/CMakeLists.txt中使用

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR})
cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)
通过这种方式,您可以将include目录“链接”到它所属的目标,并且依赖它的所有目标都会自动包含该目录


此外,您可能希望将公共标题移动到它们自己的子文件夹
/my\u project/utils/base\u c/base\u c/
,然后将它们作为
\include“base\u c/base\u c.h”
包含。这为标题引入了一种“名称空间”,防止来自不同项目的同名标题模棱两可。

正如@Anedar提到的,要解决这种情况,需要在库
CMakeLists.txt
中使用
PUBLIC
接口
选项
包含目录
。填充
INTERFACE\u的包括库目标的\u目录
,它由消费端的
target\u link\u库
使用

我的工作配置:

/my_项目/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR})
cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)
/my_项目/utils/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR})
cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)
/my_project/utils/base_c/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR})
cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)
/我的项目/utils/base\u cpp/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR})
cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)

接口包含目录的文档如何表示不需要
目标包含目录
?我很好奇你是如何在没有
include\u目录
target\u include\u目录
@Tsyvarev的情况下编译单个库的,我可能完全错了。您能解释一下我如何使用库的
接口\u INCLUDE\u目录吗?在CMake之后您使用哪种构建系统?生成文件?VisualStudio项目?你能检查那些文件吗?哪些目录实际上是作为包含目录传递的?我需要在
base\u cpp
中的消费端做些什么吗?当前
find_library
返回
BASEC-NOTFOUND
您不需要在同一项目中查找库。只需使用
target\u link\u库(base\u cpp base\u c)
好的,我这样做了,但它无法解析标题。也许我需要
target\u include\u目录(base\u cpp)
?@voddan:
它无法解析标题。
-看起来你的代码以意外的方式包含标题。使用新的CMake代码和实际错误消息更新您的问题帖子。这是一个正确的答案,但解释是无效的,因此我在需要时没有得到它:(