A类调用了B类,C主函数调用A和B
A.h
#ifndef A_H #define A_H #include <iostream> //#include "../folder2/B.h" // 正常情况 //# 包含根目录 A.h可以直接引用 B.h //target_include_directories(folder1_lib PUBLIC ${CMAKE_SOURCE_DIR}) #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(); }
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; }
main.cpp
// 直接路径 没有经过 target_include_directories(main PRIVATE ${CMAKE_SOURCE_DIR}) #include "folder1/A.h" #include "folder2/B.h" int main() { A a; B b; // 调用 A 类的函数 a.doSomething(); // 调用 B 类的函数 b.performAction(); return 0; }
CMakeLists_1 最简单 直接相对路径调用文件.txt
cmake_minimum_required(VERSION 3.5) project(MyProject) # Set C++ standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Include directories include_directories(${CMAKE_SOURCE_DIR}/folder1) include_directories(${CMAKE_SOURCE_DIR}/folder2) # Source files in folders set(folder1_sources folder1/A.cpp ) set(folder2_sources folder2/B.cpp ) # Main executable add_executable(main main.cpp ${folder1_sources} ${folder2_sources})
CMakeLists_2 中等 编译成库调用.txt
cmake_minimum_required(VERSION 3.0) project(MyProject) # 设置编译选项 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) #project_folder/ #│ #├── CMakeLists.txt #├── folder1/ #│ ├── A.h #│ └── A.cpp #│ #└── folder2/ # ├── B.h # └── B.cpp # 添加文件夹1中的源文件 add_library(folder1_sources folder1/A.cpp ) # 添加文件夹2中的源文件 add_library(folder2_sources folder2/B.cpp ) # 添加可执行文件并链接两个库 add_executable(main_executable main.cpp) target_link_libraries(main_executable folder1_sources folder2_sources) # 添加包含文件夹的路径 应该无用 这里有用是因为main.c和folder1 folder2在同级目录
target_include_directories(folder1_sources PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/folder1) target_include_directories(folder2_sources PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/folder2)
CMakeLists.txt 3最简洁但是难以理解的方案
cmake_minimum_required(VERSION 3.5) project(MyProject) # Set C++ standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Add subdirectories add_subdirectory(folder1) add_subdirectory(folder2) # Main executable add_executable(main main.cpp) target_include_directories(main PRIVATE ${CMAKE_SOURCE_DIR}) # 避免相对路径使用 但是main本来就是相对路径 # Link main executable with folder1_lib and folder2_lib target_link_libraries(main PRIVATE folder1_lib folder2_lib)
# Create a library for folder1 (assuming A.cpp is compiled into a library) add_library(folder1_lib A.cpp A.h) # 包含根目录 A.h可以直接引用 B.h target_include_directories(folder1_lib PUBLIC ${CMAKE_SOURCE_DIR}) # Link folder1_lib with folder2_lib (assuming it uses B from folder2) target_link_libraries(folder1_lib PUBLIC folder2_lib)
# Create a library for folder2 (assuming B.cpp is compiled into a library) add_library(folder2_lib B.cpp B.h) # Set include directories for folder2 (optional, if needed) target_include_directories(folder2_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})