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)
编译过程就是这样的: