前言
随着时间的发展,一个项目实现所有需求已经被证实是一个不合理的方案。
逐渐臃肿的工程文件,繁琐的编译过程,团队合作分工开发越来越麻烦等等导致了多项目管理的需求逐渐被重视。
本文将简单讲解如何使用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