Linux下cmake实用模板

生成动态库

代码目录结构如下:

代码目录结构
  • build : 编译目录
  • CMakeLists.txt :编写cmake生成规则
  • lib :指定动态库的生成目录
  • src :源代码目录

这里我们library.h的代码:

#ifndef MYSHAREDLIB_LIBRARY_H
#define MYSHAREDLIB_LIBRARY_H
 
// 打印 Hello World!
void hello();
 
// 使用可变模版参数求和
template <typename T>
T sum(T t)
{
    return t;
}
template <typename T, typename ...Types>
T sum(T first, Types ... rest)
{
    return first + sum<T>(rest...);
}
 
#endif

library.cpp的代码:

#include <iostream>
#include "library.h"
 
void hello() {
    std::cout << "Hello, World!" << std::endl;
}

于是,为了生成libMySharedLib.so我们的CMakeLists.txt可以这样写:

cmake_minimum_required(VERSION 2.8)
project(MySharedLib)
# C++11 编译
set(CMAKE_CXX_STANDARD 11)
#设置动态库的生成路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY  ${PROJECT_SOURCE_DIR}/lib)
#创建共享库
add_library(MySharedLib SHARED src/library.cpp)

使用动态库

代码目录结构如下:

  • bin : 目标程序生成目录
  • src : 目标程序源代码目录
  • thirdparty : 库文件的目录(库发布者提供头文件和动态库/静态库文件)

其中,main.cpp代码如下:

#include <iostream>
#include "library.h"
using namespace std;

int main()
{
    hello();

    int a = 10;
    float b = 2.6;
    double c = 6.2;
    auto result = sum(a, b, c);
    cout << "a + b + c = " << result << endl;
    return 0;
}

于是,依赖libMySharedLib.so动态库的程序构建的CMakeLists.txt可以这样写:

#cmake版本
cmake_minimum_required(VERSION 3.4.0)
 
#项目名:test
project(test)
 
# 传递FLAGS给C++编译器
set(CMAKE_CXX_COMPILER      "g++" )         # 显示指定使用的C++编译器
set(CMAKE_CXX_FLAGS   "-std=c++11")             # c++11
set(CMAKE_CXX_FLAGS   "-g")                     # 调试信息
set(CMAKE_CXX_FLAGS   "-Wall")                  # 开启所有警告

set(CMAKE_CXX_FLAGS_DEBUG   "-O0" )             # 调试包不优化
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG " )   # release包优化
#指定生成的版本
#set(CMAKE_BUILD_TYPE DEBUG)
 
#指定编译选项
#set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall")
 
# 设置头文件路径
set(INC_DIR  ${CMAKE_SOURCE_DIR}/thirdparty/mylib/include)
include_directories(${INC_DIR})
 
# 设置库文件路径(指定静态和动态文件目录)
set(LIB_DIR ${CMAKE_SOURCE_DIR}/thirdparty/mylib/lib)
link_directories(${LIB_DIR})

#设置目程序生成路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY  ${PROJECT_SOURCE_DIR}/bin)
message(PROJECT_SOURCE_DIR:  ${PROJECT_SOURCE_DIR})

#链接库,MySharedLib为库名
link_libraries(MySharedLib)

#指定源代码
set(SOURCE_FILES  ${CMAKE_SOURCE_DIR}/src/main.cpp)
#生成目标文件 
add_executable(${PROJECT_NAME} ${SOURCE_FILES})

# 链接 库文件 MySharedLib 库
target_link_libraries(${PROJECT_NAME} MySharedLib)

编译过程就是这样的:

编译过程
程序构建过程

参考文献

  1. Linux下CMake简明教程
  2. Linux 下cmake生成SO库的使用实例
posted @ 2022-05-12 14:44  时间的风景  阅读(304)  评论(0编辑  收藏  举报