c++ cmake 多文件项目,多个cmakelists.txt,每个模块都可以单独编译运行,项目根目录下有include文件夹,里面的头文件被所有模块引用,出现undefined_reference错误
时间: 2024-02-28 16:53:20 浏览: 65
CMake项目模板 ./include - 头文件目录
出现 undefined reference 错误通常是因为链接器找不到相关的库或者符号,一般是因为链接顺序不正确导致的。在 CMake 中,我们可以使用 target_link_libraries 命令来指定链接顺序。
假设我们有三个模块:module1、module2 和 module3,它们都需要使用位于项目根目录下的 include 文件夹中的头文件,并且 module1 和 module2 都依赖于 module3。目录结构如下:
```
project/
|-- CMakeLists.txt
|-- include/
| `-- common.h
|-- module1/
| |-- CMakeLists.txt
| `-- source1.cpp
|-- module2/
| |-- CMakeLists.txt
| `-- source2.cpp
`-- module3/
|-- CMakeLists.txt
`-- source3.cpp
```
首先,在项目根目录下的 CMakeLists.txt 中添加 include 文件夹,并定义一个公共的库:
```cmake
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 添加 include 文件夹
include_directories(include)
# 添加子目录
add_subdirectory(module1)
add_subdirectory(module2)
add_subdirectory(module3)
# 添加公共库
add_library(common_lib STATIC)
# 将 common.h 添加到库中
target_sources(common_lib PRIVATE ${PROJECT_SOURCE_DIR}/include/common.h)
```
然后,在每个模块的 CMakeLists.txt 中,分别定义自己的可执行文件,并引用公共头文件和公共库:
```cmake
# module1/CMakeLists.txt
add_executable(module1 source1.cpp)
# 引用公共头文件
target_include_directories(module1 PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 引用公共库
target_link_libraries(module1 PRIVATE common_lib)
```
```cmake
# module2/CMakeLists.txt
add_executable(module2 source2.cpp)
# 引用公共头文件
target_include_directories(module2 PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 引用公共库
target_link_libraries(module2 PRIVATE common_lib)
```
```cmake
# module3/CMakeLists.txt
add_library(module3 SHARED source3.cpp)
# 引用公共头文件
target_include_directories(module3 PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 引用公共库
target_link_libraries(module3 PUBLIC common_lib)
```
注意,在 module3 的 CMakeLists.txt 中,我们将 common_lib 设置为 PUBLIC,这样 module1 和 module2 就可以访问公共库中的函数和变量了。
现在,我们可以分别在 module1、module2 和 module3 目录下运行 cmake 和 make 命令,分别编译并运行每个模块:
```bash
cd module1
mkdir build && cd build
cmake ..
make
./module1
```
```bash
cd module2
mkdir build && cd build
cmake ..
make
./module2
```
```bash
cd module3
mkdir build && cd build
cmake ..
make
./module3
```
如果出现 undefined reference 错误,可以尝试调整 target_link_libraries 命令的顺序。通常情况下,被依赖的库应该放在依赖它的库的后面。
阅读全文