• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
c++ Cmake工程(2)平行上级目录 常用模式

正确使用

 错误使用

 

关键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();
}

  

 

posted on 2024-08-03 05:17  MKT-porter  阅读(136)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3