今日份动力不足,困唧唧的,下午才开始干点事。
回顾上一节已经学会了:
①利用文件夹管理源文件、库等等,例如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文件的结果。
③按照规则,动态库是应该包含一个版本号的,我们可以看一下系统的动态库,一般情况是
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
整体的流程如上图。第一个报的警告是加版本号,在文件里加一下就行了。
以上就是全部流程。