CMake--静态库与动态库构建
小结内容
- 建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用, HelloFunc 向终端输出Hello World 字符串。
- 安装头文件与共享库。
1.代码与CMakeList.txt文件编写
首先建立 t3 目录,用于存放本节涉及到的工程
t3目录下创建lib目录用来存代码
在 t3 目录下建立 CMakeLists.txt ,
PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
#SET(LIBRARY_OUTPUT_PATH < 路径 >) #指定库的生成位置。
在 lib 目录下建立两个源文件 hello.c 与 hello.h
hello.c 内容如下:
#include "hello.h"
void HelloFunc()
{
printf("Hello Worldn");
}
hello.h 内容如下:
#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>
void HelloFunc();
#endif
在 lib 目录下建立 CMakeLists.tx
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) #添加动态库
#ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC}) #添加静态库
#ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
#SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") #更改静态库输出名字
#GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME) #获取静态库输出名字
#MESSAGE(STATUS “This is the hello_static OUTPUT_NAME:”${OUTPUT_VALUE})
#SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1) #设置动态库版本号
#INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) #安装静态库与动态库
#INSTALL(FILES hello.h DESTINATION include/hello) #安装头文件
2.编译动态库与静态库:
仍然采用 out-of-source 编译的方式,按照习惯,我们建立一个 build 目录,在 build 目录中
$cmake ..
$make
可以在 lib 目录得到一个 libhello.so
3.指令解析
ADD_LIBRARY
ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
1)第一个参数为库的名字,不需要写全 libhello.so ,只需要填写 hello 即可, cmake 系统会自动为你生成libhello.X。
2)类型有三种 :
- SHARED ,动态库
- STATIC ,静态库
- MODULE ,在使用 dyld 的系统有效,如果不支持 dyld ,则被当作 SHARED 对待。
3)EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
SET_TARGET_PROPERTIE
SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
1)这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本。
与他对应的指令是:
GET_TARGET_PROPERTY(VAR target property)
来获取target属性。
2)这条指令同样可以设置动态库版本号
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
- VERSION 指代动态库版本
- SOVERSION 指代 API 版本
将上述指令加入 lib/CMakeLists.txt 中,重新构建看看结果。
在 build/lib 目录会生成:
libhello.so.1.2
libhello.so.1->libhello.so.1.2
libhello.so ->libhello.so.1
install
将 libhello.a, libhello.so.x 以及 hello.h 安装到系统目录,才能真正让其他人开发使用,在本例中利用上一节了解到的 INSTALL 指令,我们向 lib/CMakeLists.txt 中添加如下指令:
INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include/hello)
通过终端执行:
$cmake -DCMAKE_INSTALL_PREFIX=/usr ..
$make
$sudo make install
我们就可以将头文件和共享库安装到系统目录 /usr/lib 和 /usr/include/hello 中了。
CMake--静态库与动态库构建的更多相关文章
- (转)HelloWorld CMake CMake中构建静态库与动态库及其使用
继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello ...
- VisualGDB系列7:使用VS创建Linux静态库和动态库
根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文介绍如何在VS中创建静态库和动态库, ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- linux产生静态库和动态库
如何构建一个库 静态库(.a) 静态库的建立和使用是非常简单的: 1. 编译源文件:gcc -Wall -c test1.c test2.c 2. 生成库文件:ar -cvq libtest.a 3. ...
- (转)C++静态库与动态库
转自:http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别, ...
- autotools入门笔记(二)——创建和使用静态库、动态库
带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的.只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文 ...
- 【转】C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- face++静态库转为动态库
前言 苹果商店上架应用,有规定支持iOS8.0以上的iPA可执行文件的大小不能超过60M. face++提供过来的是静态库,会导致苹果上架的ipa的包增加1.5M左右.而刚好我们的APP包Mach-O ...
随机推荐
- 部署tinyproxy代理服务
#安装依赖 yum install asciidoc #下载 wget https://github.com/tinyproxy/tinyproxy/releases/download/1.8.4/t ...
- JSONCkecker(Java语言版本)
// MIT License // // Copyright (c) 2016 Michel Kraemer // Copyright (c) 2005 JSON.org // // Permissi ...
- OAuth2基本概念和运作流程
OAuth(开放授权)是一个关于授权的开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.目前的版本是2.0版,本文 ...
- 为了下载和使用最新的git,只好安装了迅雷
一 安装迅雷时总感觉它的图标像是灰鸽子,让人不放心. 从https://git-scm.com/downloads上找到64-bit Git for Windows Setup的地址: https: ...
- 用golang chromedp 操作已经打开的chrome浏览器
win7 环境,主要是一开始想在代码中先用exec.Command启动chrome,但始终不能成功监听9222端口,折腾了很长时间, 需要先手工启动chrome监听端口,具体写在代码注释中了. 然后再 ...
- 转://Linux下误删除/home目录的恢复方法
一般情况下,我们在安装Oracle数据库的时候,都会创建一个Oracle用户,用该用户来安装和管理Oracle.Oracle用户的根目录就是/home/oracle. 通常安装Oracle数据库是按照 ...
- javascript中数组化的一般见解
javascript中数组化的一般见解,数组化浏览器中存在许多类数组对象,往往对类数组操作比较麻烦,没有数组那些非常方便的方法,在这种情况下,就有了数组化方法. 数组化的一般方法 1.第一种也是我们最 ...
- appium-基本操作的再次封装(加上文件路径、log、截图、异常处理)
一:日志 二:文件路径 三:截图 四:异常处理(对基本操作,例如:等待元素出现.点击.按键灯进行封装.加上截图和日志记录)
- openjdk8源码编译
1. 安装源码管理工具 yum install mercurial 2. 下载源码 hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u #执行源 ...
- There is no action xxxFun defined for api controller api/subitem
在使用abp的框架时,访问某个接口方法出现错误: There is no action xxxFun defined for api controller api/subitem 原因:肯定是访问的接 ...