首页 > 解决方案 > 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() {}

标签: c++cmake

解决方案


没有这样的变量${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 中有三个可见性说明符:PRIVATEINTERFACEPUBLIC. 与和PUBLIC完全相同。意味着该属性仅与目标相关;表示该属性仅与链接到该目标的目标相关。所以你想在这里。PRIVATEINTERFACEPRIVATEINTERFACEPRIVATE

* 有点……有一整套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”虽然不是免费的,但却是目前最全面的资源。我强烈推荐它。


推荐阅读