今日份动力不足,困唧唧的,下午才开始干点事。


回顾上一节已经学会了:

①利用文件夹管理源文件、库等等,例如src、doc、lib

    #当源码放入src文件中,需要单独在文件夹中编写CMakeLists.txt。在主目录上写工程总CMakeLists.

   #单独的src文件中的CMakeLists一般要写加入函数,加入库,即ADD_EXECUTABLE()、ADD_LIBRARY().

  #主目录中的CMakeList用来构建工程 、设置编译后的二进制文件和中间文件的存在位置、 设置安装位置。  PROJECT(),ADD_SUBDIRECTORY ,  INSTALL().

②利用创建build文件文件夹进行外部构建

③设置编译后的中间文件和二进制文件存放位置

   ADD_SUBDIRECTORY(源代码文件夹 目标文件夹)

④另一种设置编译后的二进制文件存放位置的方法

  SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/地址)
  SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/地址)

  这里的PROJECT_BINARY_DIR指的是编译目录的地址。外部构建的话,就是指build文件夹。他会自己递归的建立文件夹的。

  在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY,如果需要改变目标存放路径,就在哪里加入上述的定义。源码存在处的CMakeLists

③利用<prefix> 改变 安装位置。

   #在主目录CMakeLists中加入以下格式组成的:  

INSTALL

FILES

文件名:README

DESTINATION

地址2

INSTALL

PROGRAMS

非目标文件的执行文件例如:脚本

DESTINATION

地址2

INSTALL

DIRECTORY

目录安装,/目录中的内容安装

DESTINATIOIN

地址2

INSTALL

TARGETS

目标文件名:目标文件的安装

是我们通过 ADD_EXECUTABLE 或者 ADD_LIBRARY 定义的目标文件,可能是可执行二进制

RUNTIME DESTINATION

 地址

如bin

 

 

动态库

LIBRARY DESTINATION

地址如lib

 

 

静态库

ARCHIVE DESTINATION

地址如libstatic

在cmake的时候,利用语句:     cmake -DCMAKE_INSTALL_PREFIX=地址1.

最后安装出来就是,地址1+地址2组成的位置。


那么本节的任务是,创建静态库和共享库,另其提供一个函数,供其他函数编程使用。

.so文件是Linux下的动态库文件,即编好的可以供其他程序使用的代码和数据。

.a文件是静态库文件。

①主要用到的就是  ADD_LIBRARY这个命令。  生成的库文件名字为 lib+库名 .so/.a

ADD_LIBRARY


库名

SHARED

(EXCLUDE_FROM_ALL)

  这个库不会默认被构建

源文件

.c / .cpp


 

 

 

STATIC

 

 

 

 

 

 

MODULE

 

 

 

ADD_LIBRARY(hello SHARED hello.c)
ADD_LIBRARY(hello_static STATIC hello.c)
#静态库改了名字,因为不允许库名一样,如果不改只会生成动态库。后续需要再进行改名操作。

②利用ADD_LIBRARY无法构建同名的 静态库和共享库。为了满足这个需求,需要用到SET_TARGET_PROPERTIES()

SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

  cmake practice 中的cmake版本比较老,现在不存在书中所提到的清除了.s文件的结果。

cmake target_link_libraries添加静态库依赖未生效_动态库

③按照规则,动态库是应该包含一个版本号的,我们可以看一下系统的动态库,一般情况是
                   libhello.so.1.2
                   libhello.so ->libhello.so.1
                   libhello.so.1->libhello.so.1.2

SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

          VERSION 指代动态库版本,SOVERSION 指代 API 版本。

④安装库和头文件,投入使用。

我们需要将 libhello.a, libhello.so.x 以及 hello.h 安装到系统目录,才能真正让其他人开发使用

在本例中我们将 hello 的共享库安装到<prefix>/lib 目录,将 hello.h 安装到<prefix>/include/hello 目录。

安装共享库是上一节学习的内容,就是 INSTALL (TARGETS  xx  ……)

lib/CMakeLists.txt 中添加如下指令,这个安装命令是,要安装的文件在哪就在哪里写,要安装的文件都在lib文件夹内,所以在lib里的CMakeLists中添加安装指令。

INSTALL(TARGETS hello hello_static 
          LIBRARY DESTINATION lib
          ARCHIVE DESTINATION lib
)
INSTALL (FILES hello.h DESTINATION include/hello)

假设我们想安装到  /tmp/t3/usr

cmake -DCMAKE_INSTALL_PREFIX=/tmp/ts/usr ..
make
make install

cmake target_link_libraries添加静态库依赖未生效_静态库_02

整体的流程如上图。第一个报的警告是加版本号,在文件里加一下就行了。

以上就是全部流程。