使用CMake编写多项目、子项目管理

前言

随着时间的发展,一个项目实现所有需求已经被证实是一个不合理的方案。
逐渐臃肿的工程文件,繁琐的编译过程,团队合作分工开发越来越麻烦等等导致了多项目管理的需求逐渐被重视。
本文将简单讲解如何使用CMake实现多个子项目的编译构建,其中包括一个动态库项目和一个链接该动态库的可执行文件。

代码下载地址:https://download.csdn.net/download/weixin_41649821/89330068

搭建项目框架

整体架构为

BuildDynamicLibrary

  • build
  • include
  • Opt
    • Opt.h
    • Opt.cpp
    • CmakeLists.txt
  • test
    • main.cpp
    • CmakeLists.txt
  • CmakeLists.txt

BuildDynamicLibrary将实现自动构建Opt动态库文件和test可执行文件在BuildDynamicLibrary/build目录下。
要实现这个功能,总共需要实现三步
第一,编写Opt动态库代码文件
第二,编写test代码文件
第三,编写子项目管理文件

编写Opt动态库

Opt动态库将实现一个类,其中包含了一个add方法,效果为范围两个参数的和。

Opt.h

class Opt
{
private:
/* data */
public:
Opt(/* args */);
~Opt();
int add(int A, int B);
};

Opt.cpp

#include "Opt.h"

Opt::Opt(/* args */)
{
}

Opt::~Opt()
{
}

int Opt::add(int A, int B)
{
    // int Res = A + B;

    return A + B;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(Opt CXX C)

set(CMAKE_C_FLAGS "-pthread -std=gnu99")
set(CMAKE_CXX_FLAGS "-pthread ")
set(CMAKE_EXE_LINKER_FLAGS "-pthread ")

set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_STANDARD 20)
add_definitions("-Wall -g")
add_definitions(-D_GNU_SOURCE)

# 构建动态库
add_library(${PROJECT_NAME} SHARED Opt.cpp)

编写test可执行文件

test文件将动态链接Opt库,实例一个Opt类,调用并打印add方法的返回值。

main.cpp

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "Opt.h"
using namespace std;

int main()
{
    cout << "Hello, World!" << endl;
    Opt opt;
    cout << opt.add(1, 2) << endl;

    return 0;
}

CMakeLists.txt

注意,main文件将引用BuildDynamicLibrary/include文件夹下Opt.h头文件,需要在项目管理文件中将生成的文件拷贝至相应路径下。
而libOpt.so文件因为都是在同一个大项目下,CMake可以自行找到,不需要我们手动指定动态库文件存放路径,所以可以省略掉指定链接文件夹存放路径操作,只需要指定链接Opt库即可。

cmake_minimum_required(VERSION 3.5)

project(test CXX C)

set(CMAKE_C_FLAGS "-pthread -std=gnu99")
set(CMAKE_CXX_FLAGS "-pthread ")
set(CMAKE_EXE_LINKER_FLAGS "-pthread ")

set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_STANDARD 20)
add_definitions("-Wall -g")
add_definitions(-D_GNU_SOURCE)

include_directories(../include)

add_executable(${PROJECT_NAME}
    main.cpp
)
target_link_libraries(${PROJECT_NAME} Opt)

编写子项目管理

cmake_minimum_required(VERSION 3.5)
project(BuildDynamicLibrary CXX C)

# set(CMAKE_C_FLAGS "-pthread -std=gnu99")
# set(CMAKE_CXX_FLAGS "-pthread ")
# set(CMAKE_EXE_LINKER_FLAGS "-pthread ")

# set(CMAKE_C_COMPILER "gcc")
# set(CMAKE_CXX_COMPILER "g++")
# set(CMAKE_CXX_STANDARD 20)
# add_definitions("-Wall -g")
# add_definitions(-D_GNU_SOURCE)

# 添加子项目
add_subdirectory(Opt)

# 添加子项目
add_subdirectory(test)

# # 拷贝所有头文件
set(HEAD)
file(GLOB HEAD ${CMAKE_CURRENT_SOURCE_DIR}/Opt/*.h)
file(COPY ${HEAD} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/include)

编译项目

zhzh@zhzh:~/workspace/code/CMake/BuildDynamicLibrary/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- The C compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/zhzh/workspace/code/CMake/BuildDynamicLibrary/build



zhzh@zhzh:~/workspace/code/CMake/BuildDynamicLibrary/build$ make -j20
[ 25%] Building CXX object Opt/CMakeFiles/Opt.dir/Opt.cpp.o
[ 50%] Linking CXX shared library libOpt.so
[ 50%] Built target Opt
[ 75%] Building CXX object test/CMakeFiles/test.dir/main.cpp.o
[100%] Linking CXX executable test
[100%] Built target test              



zhzh@zhzh:~/workspace/code/CMake/BuildDynamicLibrary/build$ ./test/test 
Hello, World!
3
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚拟内存会梦见进程调度嘛?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值