CMake实践(3)
一,本期目标
[sun@localhost t3]$ cat README
t3:静态库(.a)与动态库(.so)构建
任务:1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用
HelloFunc向终端输出Hello World字符串
2,安装头文件与共享库
使用方法
到<path_to>/t3/build,执行:
cmake -DCMAKE_INSTALL_PREFIX=/home/TOM/tmp ..
make
make instal
二,目录结构:
[sun@localhost t3]$ tree ../t3/
../t3
├── build
├── CMakeLists.txt
├── lib
│ ├── CMakeLists.txt
│ ├── hello.cpp
│ └── hello.h
└── README
三,CMakeList.txt
[sun@localhost t3]$ cat CMakeLists.txt
PROJECT(HELLOLIB)
cmake_minimum_required(VERSION 2.6)
ADD_SUBDIRECTORY(lib)
[sun@localhost t3]$ cat lib/CMakeLists.txt
SET(LIBHELLO_SRC hello.cpp)
#1)注意: 下面2句不能同时出现,因为target名称是唯一的,如果想要得到相同名称的动态库和静态库
#必须借助于SET_TARGET_PROPERTIES
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
#ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
#2)注意:有了以下两句,我们就可以同时得到同名的动态库和静态库了,
# 但是你会发现libhello.so却消失了,因为cmake在构建一个新的target时,
# 会尝试清理掉其它使用这个名字的库,所以在构建libhello.a时,就会清理掉libhello.so
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
#3)要避免同名不同类型的库覆盖,需要再借助于SET_TARGET_PROPERTIES指令
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
#4)增加动态库版本号
# 按照规则,动态库是应该包含一个版本号的,我们看一下系统的动态库,一般情况是:
# libhello.so.1.2
# libhello.so->libhello.so.1
# libhello.so.1->libhello.so.1.2
# 以下命令中,VERSION指代动态库版本,SOVERSION指代API版本
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
#5)安装共享库和头文件
# hello的共享库安装到<prefix>/lib目录
# hello.h安装到<prefix>/include/hello目录
INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include/hello)
#COMMAND: ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXECLUDE FROM_ALL]
# source1 source2 ... sourceN)
#注意:不需要写全libhello.so,只需要填写hello即可,cmake系统会自动为你生成libhello.X
# 类型有3种:SHARED(动态库),
# STATIC(静态库),
# MODULE(在使用dyld的系统有效,否则被当作SHARED对待)
# EXCLUDE_FROM_ALL:这个库不会被默认构建,除非有其它的组件依赖或者手工构建
#COMMAND: SET_TARGET_PROPERTIES(target1 target2 ...
# PROPERTIES prop1 value1 prop2 value2 ...)
#定义:用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本。
#备注:其它对应的指令是:GET_TARGET_PROPERTIES(VAR target property)
# 如:GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)
# MESSAGE(STATUS "This is the hello_static OUTPUT_NAME:"${OUTPUT_VALUE})
# 如果没有这个属性定义,则返回NOTFOUND
四,运行结果
[sun@localhost t3]$ cd build/
[sun@localhost build]$ cmake ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /opt/gcc/bin/gcc
-- Check for working C compiler: /opt/gcc/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /opt/gcc/bin/c++
-- Check for working CXX compiler: /opt/gcc/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sun/program/cmake_practice/t3/build
[sun@localhost build]$ make
Scanning dependencies of target hello
[ 50%] Building CXX object lib/CMakeFiles/hello.dir/hello.cpp.o
Linking CXX shared library libhello.so
[ 50%] Built target hello
Scanning dependencies of target hello_static
[100%] Building CXX object lib/CMakeFiles/hello_static.dir/hello.cpp.o
Linking CXX static library libhello.a
[100%] Built target hello_static
CMake实践(3)的更多相关文章
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》第三部分的示例代码的错误
<CMake实践>的第三章,初试cmake - cmake的helloworld 中的 PROJECT (HELLO) SET(SRC_LIST main.c) MESSAGE(statu ...
- CMake实践--操作
---<Cmake 实践>--- ---Ubuntu 14.04 1.创建一个cmake文件目录 mkdir -p ~/cmake 2.在cmake文件下创建t1子目录 cd ~/cmak ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX【转】
本文转载自:http://www.cnblogs.com/52php/p/5681751.html 四.更好一点的Hello World 没有最好,只有更好 从本小节开始,后面所有的构建我们都将采用 ...
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】
本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...
- Cmake的介绍和使用 Cmake实践【转】
本文转载自:http://www.cppblog.com/Roger/archive/2011/11/17/160368.html Cmake的介绍和使用 Cmake实践 Cmake优点: 1. ...
- Cmake的介绍和使用 Cmake实践
Cmake的介绍和使用 Cmake实践http://www.cppblog.com/Roger/archive/2011/11/17/160368.html
- CMake实践(4)
一,本期目标: [sun@localhost t4]$ cat README 任务:如何使用外部共享库和文件 二,目录结构 [sun@localhost t4]$ tree ../t4../t4├── ...
随机推荐
- ubuntu下如何快速加密可移动存储设备
ubuntu下可以快速加密U盘和其他移动存储设备.访问的时候会要你输入密码,这样就比较安全了. ubuntu的磁盘工具使用的是LUKS加密,虽然这个加密方法不跟其他系统兼容,但可以在其他试用GNOME ...
- MyBatis学习总结_02_使用MyBatis对表执行CRUD操作
一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0&q ...
- Python命令行解析库argparse
2.7之后python不再对optparse模块进行扩展,python标准库推荐使用argparse模块对命令行进行解析. 1.example 有一道面试题:编写一个脚本main.py,使用方式如下: ...
- python csv tsv处理
空行: http://www.crifan.com/python_csv_writer_writerow_redundant_new_line/
- Delphi遍历文件夹
/// <remarks> /// 遍历文件夹 (引用SysUtils单元) /// </remarks> procedure TfrmMusicMenu.SearchInDi ...
- Object窥探
/* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...
- JAVA 方法或者类的注释快捷键
JAVA 方法或者类的注释快捷键 /*** 登录验证* @param 传入的* @return* @throws Exception*/这种注释效果 方法: 1.先敲“/”在敲两个**,然后回车 方法 ...
- 第二篇 顾问实施ERP与医生看病过程类比
我从08年开始涉足企业信息化咨询行业.当时做的第一个项目是汕头某黄金珠宝公司的SAP ERP业务优化项目.我在项目上担任顾问助理的角色.我们公司的老板据说是以前ORACLE公司华南区的总监,后来是格兰 ...
- 无锁编程(四) - CAS与ABA问题
CAS 一般采用原子级的read-modify-write原语来实现Lock-Free算法,其中LL和SC是Lock-Free理论研究领域的理想原语,但实现这些原语需要CPU指令的支持,非常遗憾的是目 ...
- hdu1054(二分图匹配)
题意很简单,在一颗树上找最小点覆盖. 将树染成黑白两色,构成一张二分图,然后最大匹配==最小点覆盖即可,所以一次匈牙利就可以求出来了 hdu1054 #include <iostream> ...