C++ 在CMake中包含带有库的标题
我的项目中有两个实用程序库。我正在寻找为库编写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 -->
/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代码和实际错误消息更新您的问题帖子。这是一个正确的答案,但解释是无效的,因此我在需要时没有得到它:(