
正确使用

错误使用

关键1
# 指定 main 可执行文件的包含目录,包括根目录${CMAKE_SOURCE_DIR} ( folder1 和 folder2 目录)
target_include_directories(main PRIVATE ${CMAKE_SOURCE_DIR})
找路径 要么从c和h直接相对路径引用
要么直接引用,但是在cmakelist中指定查找路径
关键2-1
防止多次引用重复编译
#ifndef B_H #define B_H 代码内容 #endif
关键2-2
拆分成 h和c 避免重复调用编译
功能
A和B类编译成库
A类调用B类
C主函数 调用A类和B类
C主函数 和 A,B在同一个目录

总 CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(MyProject) # Set C++ standard #set(CMAKE_CXX_STANDARD 11) #set(CMAKE_CXX_STANDARD_REQUIRED ON) # Add subdirectories add_subdirectory(folder1) add_subdirectory(folder2) add_subdirectory(folder3)

文件夹3 CMakeLists.txt
# 创建 folder3 的可执行文件(假设 C.cpp 是主函数)
add_executable(main C.cpp)
message(STATUS "项目根目录: " ${CMAKE_SOURCE_DIR})
# 指定 main 可执行文件的包含目录,包括根目录${CMAKE_SOURCE_DIR} ( folder1 和 folder2 目录)
target_include_directories(main PRIVATE ${CMAKE_SOURCE_DIR})
# 链接 main 与 folder1_lib 和 folder2_lib(假设 C.cpp 使用了 folder1 中的 A 和 folder2 中的 B)
target_link_libraries(main PRIVATE folder1_lib folder2_lib)
C.cpp
/*
//#include "../folder1/A.h"
//#include "../folder2/B.h"
target_include_directories 指令并指定了包含目录后,
确实可以直接使用 #include "folder1/A.h" 和 #include "folder2/B.h",
而不必使用相对路径 ../folder1/A.h 和 ../folder2/B.h。
这是因为 target_include_directories 指定了编译器在编译时查找头文件的路径,
使得编译器可以在指定的包含目录中找到这些头文件。
*/
#include "folder1/A.h"
#include "folder2/B.h"
class C {
public:
void run();
};
void C::run() {
A a;
B b;
a.doSomething();
b.performAction();
}
int main() {
C c;
c.run();
return 0;
}

CMakeLists.txt
# 定义库目标
add_library(folder2_lib STATIC B.cpp B.h)
# 设置库的公共头文件路径
target_include_directories(folder2_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
B.h
#ifndef B_H
#define B_H
#include <iostream>
class B {
public:
void performAction();
};
#endif // B_H
B.cpp
#include "B.h"
void B::performAction() {
std::cout << "Class B is performing an action." << std::endl;
}

CMakeLists.txt
# 定义库目标
add_library(folder1_lib A.cpp A.h)
#将 folder1 的当前源目录包含为公共目录,以便其他目标可以访问到 A.h 文件。# 链接 folder2 库与 folder1 库
target_include_directories(folder1_lib PUBLIC ${CMAKE_SOURCE_DIR})
target_link_libraries(folder1_lib PUBLIC folder2_lib)
A.h
#ifndef A_H
#define A_H
#include <iostream>
//#include "../folder2/B.h"
#include "folder2/B.h"
class A {
public:
void doSomething();
};
#endif // A_H
A.cpp
#include "A.h"
void A::doSomething() {
std::cout << "Class A is doing something." << std::endl;
B b;
b.performAction();
}
浙公网安备 33010602011771号