如何使用 CMake 构建库

Mik*_*sev 2 c c++ cmake

我正在开发一个相当大的 C++ 项目,我决定将源文件分成不同的模块,以便管理它们更容易一些。但是,我在使用 CMake 将文件链接在一起时遇到了问题。
所以我有两个库,都包含一些 .cpp 和 .h 文件以及一个 main.cpp 文件。该项目的目录结构如下所示:

root
  |-- library1
  |      |-- lib1.cpp
  |      |-- lib1.h
  |      `-- CMakeLists1.txt
  |
  |-- library2
  |      |-- lib2.cpp
  |      |-- lib2.h
  |      `-- CMakeLists2.txt
  |
  |-- main.cpp
  |-- main.h
  `-- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

库 2 依赖于库 1,而 main.cpp 依赖于它们两者。 我可以很容易地将 main.cpp 和 main.h 链接在一起,并在 main.cpp 中使用 main.h 中的函数。库 1 和 2 也是如此。

但我无法将库 1 链接到库 2 或其中任何一个链接到我的 main.cpp。我的主文件如下所示:

#include <iostream>
#include "main.h"
#include "lib1.h"  // linking error at this line: file lib1.h not found


int main() {
    test();

    std::cout << "Hi, I am main!" << std::endl;
    return 0;
}


void test() {  // defined in main.h
    std::cout << "Hi, I am test!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

CMake 输出:

Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
~/cmake-test/main.cpp:3:10: fatal error: 'lib1.h' file not found
#include "lib1.h"
         ^~~~~~~~
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(cmake_test)

set(CMAKE_CXX_STANDARD 20)

add_subdirectory(library1)
add_subdirectory(library2)

add_executable(main main.cpp)
target_include_directories(main PRIVATE .)

target_link_libraries(main lib1)
target_link_libraries(main lib2)
Run Code Online (Sandbox Code Playgroud)

CMakeLists1.txt:

add_library(lib1 lib1.cpp)
target_include_directories(lib1 PRIVATE .)
Run Code Online (Sandbox Code Playgroud)

CMakeLists2.txt:

add_library(lib2 lib2.cpp)
target_include_directories(lib2 PRIVATE .)

target_link_libraries(lib2 lib1)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我如何将库链接到 CMake?

谢谢你!

vre*_*vre 5

target_include_directories应创建库命令的包含目录PUBLIC。否则,您无法访问依赖项目中的标头。