
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})
浙公网安备 33010602011771号