c++ - CMake:自定义库没有此类文件或目录错误
问题描述
我正在尝试使用 CMake 制作一个库。我希望这个库能够与广泛使用的库一样工作,所以我模仿了互联网上的几种 CMake 文件结构,如果可能的话,最后制作了一个如下所述的结构。另外,我想使用#include
代码片段中显示的 s 。
但是,我收到一个致命错误,lib1.cpp
其中显示“lib1.hpp:没有这样的文件或目录”。
在修复当前错误后,我很确定这个错误不是我会得到的唯一错误。我究竟做错了什么?
以下是目录、CMake 文件和源的列表。
LIB_ROOT
CMakeLists.txt // mainCMake
+ lib
| CMakeLists.hpp // libCMake
| mainlib.hpp
| + include
| | lib1.hpp
| | lib2.hpp
| | ...
| + src
| | lib1.cpp
| | lib2.cpp
| | ...
+ test
| CMakeLists.txt // testCMake
| test.cpp
主要CMake:
cmake_minimum_required(VERSION 3.10)
project(LIB)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR})
set(CMAKE_CXX_STANDARD 20)
add_subdirectory(lib)
add_subdirectory(test)
libCMake:
add_library(LIB
mainlib.hpp
#include
include/lib1.hpp
include/lib2.hpp
...
#src
src/lib1.cpp
src/lib2.cpp
...
)
target_include_directories(LIB PUBLIC ${CMAKE_CURRENT_DIR}/include ${CMAKE_CURRENT_DIR}/src)
测试CMake:
add_executable(Test test.cc)
target_link_libraries(Test LINK_PUBLIC LIB)
lib1.hpp
#ifndef lib1
#define lib1
namespace lib {}
#endif
lib1.cpp
#include "lib1.hpp"
主库文件
#include <include/lib1.hpp>
测试.cpp
#include <mainlib.hpp>
int main() {}
解决方案
没有这样的变量${CMAKE_CURRENT_DIR}
。你肯定是说${CMAKE_CURRENT_SOURCE_DIR}
。请在此处查看 CMake 变量列表的文档:https ://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
对于CMAKE_CURRENT_SOURCE_DIR
,文档在这里:https ://cmake.org/cmake/help/latest/variable/CMAKE_CURRENT_SOURCE_DIR.html
也没有这样的论点LINK_PUBLIC
,如下所示:
# WRONG
target_link_libraries(Test LINK_PUBLIC LIB)
你打算写的那行是
target_link_libraries(Test PRIVATE LIB)
有一个PUBLIC
关键字,但它对可执行文件没有意义,因为您无法链接到可执行文件*。CMake 中有三个可见性说明符:PRIVATE
、INTERFACE
和PUBLIC
. 与和PUBLIC
完全相同。意味着该属性仅与目标相关;表示该属性仅与链接到该目标的目标相关。所以你想在这里。PRIVATE
INTERFACE
PRIVATE
INTERFACE
PRIVATE
* 有点……有一整套ENABLE_EXPORTS
用于编写插件的东西,但它比较少见。
此外,这条线没有意义:
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR})
除非您在项目的根目录中有自定义 CMake 模块,否则这是没有意义的,并且会覆盖用户设置CMAKE_MODULE_PATH
自己的能力。就像是
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
有点常见,但除非您确实有自定义模块,否则仍然毫无意义。
我正在尝试使用 CMake 制作一个库。我希望该库能够与广泛使用的库一样工作,因此我模仿了互联网上的几种 CMake 文件结构
很抱歉让您知道,但模仿现有的 CMake 构建是一种糟糕的方法。其中许多是在 CMake 石器时代编写的(版本低于 3.14……您应该使用最新的代码来编写新代码)并使用不良或过时的做法。寻找 Craig Scott 和 Deniz Bahadir 在 CppCon 和 Meeting C++ 上的演讲以获得更好的建议。Craig Scott 的书“Professional CMake”虽然不是免费的,但却是目前最全面的资源。我强烈推荐它。
推荐阅读
- javascript - 在单击时重新插入的元素上使用Parents()
- javascript - 聊天系统的滚动条一直自动向下滚动
- reactjs - 如何使用 Context 传递 useReducer 状态?- 反应原生
- java - 有没有办法设置下拉高度的限制?或者甚至对下拉列表中显示的项目设置限制?
- perl - 在 Template Toolkit 中按值而不是键对哈希引用进行排序
- c++ - 在应用程序终止时关闭 COM 端口
- kubernetes - 有没有像 Istio 这样支持 LXC 容器的服务网格实现?
- javascript - 如果在 textarea 中输入空格,则 Make 按钮将被禁用
- reactjs - Mapbox 地图未显示(react-map-gl)
- node.js - 在perl中将JSON缓冲区转换为字符串