【发布时间】:2020-11-21 06:55:46
【问题描述】:
我正在处理一个相当大的 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
库 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;
}
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"
^~~~~~~~
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)
CMakeLists1.txt:
add_library(lib1 lib1.cpp)
target_include_directories(lib1 PRIVATE .)
CMakeLists2.txt:
add_library(lib2 lib2.cpp)
target_include_directories(lib2 PRIVATE .)
target_link_libraries(lib2 lib1)
在这种情况下,如何将库与 CMake 链接?
谢谢!
【问题讨论】:
-
为库
PUBLIC制作target_include_directories。否则无法访问依赖项目中的标头。 -
@vre 谢谢,这正是我所需要的。
-
@MikhailStefantsev 作为一般建议,我建议使用新形式的目标链接库:
target_link_libraries(main PRIVATE lib1)和target_link_libraries(lib2 PUBLIC lib1)