小结内容

  • 建立一个静态库和动态库,提供 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--静态库与动态库构建的更多相关文章

  1. (转)HelloWorld CMake CMake中构建静态库与动态库及其使用

    继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello ...

  2. VisualGDB系列7:使用VS创建Linux静态库和动态库

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文介绍如何在VS中创建静态库和动态库, ...

  3. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

  4. C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  5. linux产生静态库和动态库

    如何构建一个库 静态库(.a) 静态库的建立和使用是非常简单的: 1. 编译源文件:gcc -Wall -c test1.c test2.c 2. 生成库文件:ar -cvq libtest.a 3. ...

  6. (转)C++静态库与动态库

    转自:http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别, ...

  7. autotools入门笔记(二)——创建和使用静态库、动态库

    带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的.只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文 ...

  8. 【转】C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  9. face++静态库转为动态库

    前言 苹果商店上架应用,有规定支持iOS8.0以上的iPA可执行文件的大小不能超过60M. face++提供过来的是静态库,会导致苹果上架的ipa的包增加1.5M左右.而刚好我们的APP包Mach-O ...

随机推荐

  1. 解决新版chrome无法手动拖动安装插件 提示“无法从该网站添加应用,扩展程序和用户脚本”

    开发模式安装 把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar 解压压缩文件 在Chrome的地址栏中输入:chrome://extensions/ 打开Chrome ...

  2. 7.02-bs4_btc

    import requests from bs4 import BeautifulSoup from lxml import etree import json class BtcSpider(obj ...

  3. SQLite也可能出现死锁

    提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁.下面举个例子:连接1:BEGIN (UNLOCKED)连接1:SELECT ... (SHARED)连接1:INSERT ... (RESE ...

  4. Java学习笔记(四)——好记性不如烂键盘(答答租车)

    根据所学知识,编写一个控制台版的租车系统. 功能: 1. 展示所有可租车辆 2. 选择车型.租车辆 3. 展示租车清单,包含:总金额.总载货量及其车型.总载人量及其车型 代码参考imooc中Java课 ...

  5. Interrupt

    Interrupt ,给线程发送一个中断信号 给t1线程发送了中断信号,t1对线程的中断信号判断后,跳出循环,线程t1运行结束 public class Demo { public static vo ...

  6. UVA12627-Erratic Expansion(递归)

    Problem UVA12627-Erratic Expansion Accept: 465  Submit: 2487Time Limit: 3000 mSec Problem Descriptio ...

  7. SkylineGlobe TerraExplorer Pro 遇到模型显示有锯齿怎么办?

    SkylineGlobe TerraExplorer Pro 遇到模型显示有锯齿怎么办? 这个问题跟软件的版本无关,跟机器的显卡有关,看下面的截图: 试试看,祝你好运!

  8. Burp Suite学习之Intruder的4种攻击模式

    burp suit的intruder攻击共有四种模式,如图所示,下面分别讲讲这四种模式的使用方法和场景. 一 .Sniper模式 Sniper模式使用一组payload集合,它一次只使用一个paylo ...

  9. vue引入css的两种方式

    方案1.在main.js中引入方式    import '@/assets/css/reset.css' 方案2.在.vue文件的<style/>标签里面引入    @import &qu ...

  10. CSS选择器之基本选择器总结

    一.元素选择器(所有浏览器支持) 元素选择器(标签名选择器)其实就是文档的元素,如html,body,p,div等等, 下面例子中选择了span元素,并设置了字体颜色为红色. <body> ...