首页 > 其他分享 >CMakeLists编译静态库与动态库

CMakeLists编译静态库与动态库

时间:2023-07-11 11:47:59浏览次数:28  
标签:CMakeLists target mymath 静态 编译 add include cc

一、编写一个库
编写一个计算整数和浮点数之和的库函数mymath,文件目录

 

mymath.h

#ifndef MYMATH_H
#define MYMATH_H
 
int add(int, int);
double add(double, double);
 
#endif
mymath.cc

#include "mymath.h"
 
int add(int a, int b){
    return a+b;
}
 
double add(double a, double b){
    return a+b;
}
主文件mymathApp.cc

#include <iostream>
#include "mymath.h"
 
using namespace std;
 
int main(int argc, char const *argv[])
{
    double a = add(1.1, 1.1);
    int b = add(1, 1);
    cout << "1.1加1.1等于" << a <<endl;
    cout << "1加1等于" << b <<endl;
    return 0;
}
二、编译静态库
cmake_minimum_required(VERSION 3.0)
 
project(Installation VERSION 1.0)
 
# 如果想生成静态库,使用下面的语句
 
add_library(mymath mymath.cc)
target_include_directories(mymath PUBLIC ${CMAKE_SOURCE_DIR}/include)
 
 
# 生成可执行文件
add_executable(mymathapp mymathApp.cc)
target_link_libraries(mymathapp mymath)
target_include_directories(mymathapp PRIVATE ${CMAKE_SOURCE_DIR}/include)
三、编译动态库
cmake_minimum_required(VERSION 3.0)
project(Installation VERSION 1.0)
 
# 如果想生成动态库,使用下面的语句
add_library(mymath SHARED mymath.cc)
target_include_directories(mymath PRIVATE  ${CMAKE_SOURCE_DIR}/include)
set_target_properties(mymath PROPERTIES PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/mymath.h)
 
# 生成可执行文件
add_executable(mymathapp mymathApp.cc)
target_link_libraries(mymathapp mymath)
target_include_directories(mymathapp PRIVATE ${CMAKE_SOURCE_DIR}/include)
四、同时编译静态库与动态库
同样使用上面的指令,我们在支持动态库的基础上再为工程添加一个静态库,按照一般的习
惯,静态库名字跟动态库名字应该是一致的,只不过后缀是.a 罢了。

下面我们用这个指令再来添加静态库:

add_library(mymath STATIC mymath.cc)
然后再在 build 目录进行外部编译,我们会发现,静态库根本没有被构建,仍然只生成了
一个动态库。因为mymath 作为一个 target 是不能重名的,所以,静态库构建指令无效。

如果我们把上面的 mymath 修改为 mymath _static:

add_library(mymath_static STATIC mymath.cc)
就可以构建一个 libmymath_static.a 的静态库了。
这种结果显示不是我们想要的,我们需要的是名字相同的静态库和动态库,因为 target 名
称是唯一的,所以,我们肯定不能通过 ADD_LIBRARY 指令来实现了。这时候我们需要用到
另外一个指令:
SET_TARGET_PROPERTIES,其基本语法是:

SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本

cmake_minimum_required(VERSION 3.0)
project(Installation VERSION 1.0)
 
# 如果想生成动态库,使用下面的语句
add_library(mymath SHARED mymath.cc)
 
#VERSION 指代动态库版本,SOVERSION 指代 API 版本
SET_TARGET_PROPERTIES(mymath PROPERTIES VERSION 1.2 SOVERSION 1)
 
target_include_directories(mymath PRIVATE  ${CMAKE_SOURCE_DIR}/include)
 
set_target_properties(mymath PROPERTIES PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/mymath.h)
 
# 如果同时要生成静态库
add_library(mymath_static STATIC mymath.cc)
SET_TARGET_PROPERTIES(mymath_static PROPERTIES OUTPUT_NAME "mymath")
 
# 生成可执行文件
add_executable(mymathapp mymathApp.cc)
target_link_libraries(mymathapp mymath)
target_include_directories(mymathapp PRIVATE  ${CMAKE_SOURCE_DIR}/include)
参考:

http://file.ncnynl.com/ros/CMake%20Practice.pdf

CMake之install方法的使用 - 知乎

标签:CMakeLists,target,mymath,静态,编译,add,include,cc
From: https://www.cnblogs.com/kn-zheng/p/17544181.html

相关文章

  • Cmake交叉编译编译动态库
    cmakelists.txt写法如下 编译指令:cmake-DCMAKE_CXX_COMPILER:FILEPATH=/home/wangwc/CompilerCollection/RuiXinWei/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++… aux_source_directory:遍历./ITA_LIB目......
  • Ubuntu12.04 交叉编译 opencv-2.4.11过程
    1.Ubuntu换源可换源有很多,不过要下载12.04版的,好像不多。1.1先备份源sudocp/etc/apt/sources.list/etc/apt/sources.list.backup1.2由于12.04不受支持了,12.04相关的这些包的资源被移到了old-releases.ubuntu.com域名下:sudogedit/etc/apt/sources.list将下面内容插入......
  • 驾驶舱静态图片
      ......
  • 静态vlan的划分
    静态vlan的划分1,toupu图2,配置id与子网掩码2.1,pc,server的ip与子网配置pc5pc6pc7pc8server1server23,vlan的静态划分1,vlan20的划分1.1,将pc5划分到vlan201.2,将pc6划分到vlan201.3,交换机与交换机的划分SW3SW21.4,见过server划分到vlan204,ping通pc5,这......
  • apollo+carsim自动驾驶控制模块仿真 windows联系独编译,
    apollo+carsim自动驾驶控制模块仿真windows联系独编译,和carsim联合仿真仿真调试有编译和调试过程文档基于windows平台,所有依赖的库有预编译好的包apollo6.0版本。ID:6699625478961058......
  • MyEclipse 10 配置jad反编译工具步骤及详解
    MyEclipse10如何查看底层源码可以配置jad//下面是步骤:方法一1、下载jad158g.win.zip文件和net.sf.jadclipse_3.3.0.jar文件。2、将下载的jad158g.win.zip文件解压,并将jad.exe文件复制到jdk的安装目录下的jre文件夹下。例如:D:\develop\Java\jre7\bin\jad.exe。3、将下载的net......
  • c/c++程序编译运行全过程
    一.预处理-gcc-E1.进行头文件的替换(执行预处理指令)2.删除注释3.不会检查语法二.编译-gcc-S1.会检查语法2.将C语言代码翻译成对应平台的汇编语言三.汇编-gcc-c将汇编语言翻译成二进制指令四.链接-gcc-o把用到的标准库的函数实现,系统启动代码一并链接到最后生成的可......
  • 编译运行Secure Value Recovery Service v2
    下载项目gitclonehttps://github.com/signalapp/SecureValueRecovery2.git 编译makedockersh报错 修改DockerfileARGPROTOC_GEN_GO_GITREV=6875c3d7242d1a3db910ce8a504f124cb840c23aRUNgoenv-wGOPROXY=https://goproxy.cn,directRUNgoinstallgoogle.......
  • exe反编译工具IDA
    《竞学实训》报告      学      院 :网络空间安全学院专      业 :学生学号:学生姓名:     二〇二三年七月           实验 MalwareAnalysis 一.实验目的掌握MalwareAnalysis的方法。二.实验......
  • 华为ensp配置静态路由,三路由,三pc
    华为ensp配置静态路由目的:使pc1,pc2,pc3能相互ping通1,tuop图的搭建1,如图所示:先搭建好设备的通讯关系,在标记好每台设备对应的,ip地址和网关。 2,pc的网关,与ip地址的配置如图pc网关和ip配置pc1pc2pc33,路由器的改名与网关配置1.路由器的改名R1,R2,R3<Huawei>sys从用户......