一,本期目标

[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)的更多相关文章

  1. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  2. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  3. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  4. 《CMake实践》第三部分的示例代码的错误

    <CMake实践>的第三章,初试cmake - cmake的helloworld 中的 PROJECT (HELLO) SET(SRC_LIST main.c) MESSAGE(statu ...

  5. CMake实践--操作

    ---<Cmake 实践>--- ---Ubuntu 14.04 1.创建一个cmake文件目录 mkdir -p ~/cmake 2.在cmake文件下创建t1子目录 cd ~/cmak ...

  6. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX【转】

    本文转载自:http://www.cnblogs.com/52php/p/5681751.html 四.更好一点的Hello World 没有最好,只有更好 从本小节开始,后面所有的构建我们都将采用  ...

  7. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】

    本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...

  8. Cmake的介绍和使用 Cmake实践【转】

    本文转载自:http://www.cppblog.com/Roger/archive/2011/11/17/160368.html Cmake的介绍和使用 Cmake实践 Cmake优点: 1.    ...

  9. Cmake的介绍和使用 Cmake实践

    Cmake的介绍和使用 Cmake实践http://www.cppblog.com/Roger/archive/2011/11/17/160368.html

  10. CMake实践(4)

    一,本期目标: [sun@localhost t4]$ cat README 任务:如何使用外部共享库和文件 二,目录结构 [sun@localhost t4]$ tree ../t4../t4├── ...

随机推荐

  1. 物联网操作系统Hello China V1.76(PC串口版)版本发布

    作为向ARM平台移植的基线版本,经过三个多月的努力,Hello China V1.76终于完成并发布.相对原来发布的V1.75版本,该版本主要做了如下修改: 彻底去掉了原来版本源代码中的C++特性,采 ...

  2. Winsock IOCP模型(四篇)

    http://blog.csdn.net/visualeleven/article/details/6041893 http://blog.csdn.net/visualeleven/article/ ...

  3. C++:delete和delete[]释放内存的区别

      C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[].  关于 new[] 和 delete[], ...

  4. Linux功能-环境变量

    linux系统中有很多重要的环境变量,我们可以用env命令查看它们. 变量是由固定的“变量名”与用户或系统设置的“变量值”两部分组成,也可以自行修改. [root@localhost ~]# env ...

  5. 8天学通MongoDB

    随笔分类 - MongoDB 双十一来了,别让你的mongodb宕机了 摘要: 好久没过来吹牛了,前段时间一直赶项目,没有时间来更新博客,项目也终于赶完了,接下来就要面临双十一这场惊心动魄的处女秀考验 ...

  6. SSIS -->> Data Type

    SSIS和SQL SERVER, .NET数据类型的映射表

  7. lua简化cocos2dx的Action动画序列

    情景 今天写代码时,又要写一个很常见的动画,就是变大变小模拟那个弹性的赶脚,很常用但写起来挺麻烦,封装一下用起来就简单多了. 当然我也知道有缓动动画(EaseAction)可以实现反弹效果,但这不是重 ...

  8. html 用图片代替重置按钮

    提交时,若把按钮设置成图片提交特别方便只要 <input type="image" alt="点此提交" src="images/button. ...

  9. js dom

    JavaScript的DOM操作 1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Window对象操作 一.属性和方 ...

  10. RTC系统【转】

    http://blog.csdn.net/fanqipin/article/details/8089995 转自:http://www.cnblogs.com/muhuacat/p/5276306.h ...