正确使用
错误使用
关键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(); }