Cmake的使用(二)

下面接上篇博客记录如何通过cmake进行安装和生成动态库.静态库以及使用它们,
Test 1:先来个简单的例子,我们通过学习cmake install指令的语法来安装一些文件

#INSTALL指令用于定义安装规则,安装的内容可以包括目标二进制.动态库,静态库以及文件.目录.脚本等.

#目标文件的安装:
#       INSTALL (TARGETS targets... [[ARCHIVE | LIBRARY | RUNTIME]
#                           [DESTINATION <dir>]
#                       [PERMISSIONS permissions...]
#                       [CONFIGURATIONS
#                       [Debug | Release | ...]]
#                       [COMPONENT <component>]
#                       [OPTIONAL]] [...])
#TARGETS后指定我们想要添加的目标二进制文件.动态库或静态库
#目标类型分为ARCHIVE:静态库 LIBRARY:动态库 RUNTIME:可执行目标二进制
#注:DESTIATION定义了安装的路径,如果是以/开头表示是绝对路径,此时CMAKE_INSTALL_PREFIX定义的路径就是失效了,所以如果DESTINATION表示相对路径,则目标文件安装目录为:
# ${CMAKE_INSTALL_PREFIX}/DISTINATION



#普通文件的安装:
#        INSTALL(FILES files... DESTINATION <dir> 
#                   [PERMISSIONS permissions..]
#                   [CONFIGURATIONS [Debug | Relase | ...]]
#                   [COMPONENT <component>]
#                   [RENAME <name>] [OPTIONAL])


#非目标文件的可执行程序安装(比如脚本之类):
#      INSTALL(PROGRAMS files... DESTINATIONS <dir>
#                   [PERMISSIONS permissions...]
#                   [CONFIGURATIONS [Debug | Release | ...]]
#                   [COMPONENT <component>]
#                   [RENAME <name>] [OPTIONAL])

#注:普通文件与非目标文件的可执行程序的主要区别在于权限的不同:
#普通文件的默认权限为 OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ 即644权限
#非目标文件的可执行程序的默认权限为:OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE 即755权限


#目录的安装:
#   INSTALL(DIRECTORY dirs... DESTINATION <dir>
#                   [FILE_PERMISSIONS permissions...]
#                   [DIRECTORY_PERMISSIONS permissions...]
#                   [USE_SOURCE_PERMISSIONS]
#                   [CONFIGURATIONS [Debug | Release | ...]]
#                   [COMPONENT <component>]
#                   [[PATTERN <pattern> | REGEX <regex>]
#                       [EXCLUDE] [PERMISSIONS permissio
#ns...]][...])




#添加库
#   ADD_LIBRARY(libname [SHARED | STATIC | MOUDLE]
#       [EXCLUDE_FROM_ALL] source1 source2 ... sourceN
#   )
# SHARED:动态库    
# STATIC:静态库 
# MOUDLE:对支持dyld的系统有效,如果不支持则被当作shared
# EXCLUDE_FROM_ALL参数意思是这个库不会被默认构建,除非有其他组件依赖或者手工构建

我们创建项目目录(proj4)建立lib目录里面编写hello.h和hello.c文件如下:
hello.h

#ifndef HELLO_H
#define HELLO_H

#include <stdio.h>

void HelloFunc();

#endif /*HELLO_H*/

hello.c

#include "hello.h"

void HelloFunc() {
    printf("Hello,World\n");
}

在lib目录下编写CMakeLists.txt文件:

SET(LIBHELLO_SRC "hello.c")
ADD_LIBRARY(hello_shared SHARED ${LIBHELLO_SRC})   #构建生成hello_shared动态库
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})   #构建生成hello_static动态库
SET_TARGET_PROPERTIES(hello_shared PROPERTIES OUTPUT_NAME "hello")  #设置输出动态库名称为libhello.so
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")  #设置输出静态库名称为libhello.a
SET_TARGET_PROPERTIES(hello_shared PROPERTIES VERSION 1.2 SOVERSION 1)  #给动态库添加版本号
INSTALL(TARGETS hello_shared hello_static LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)    #安装动态库和静态库到CMAKE_INSTALL_PREFIX/lib下
INSTALL(FILES hello.h DESTINATION include/hello)    #安装头文件到CMAKE_INSTALL_PREFIX/include/hello下

在项目目录下编写CMakeLists.txt如下

PROJECT(HELLO)
ADD_SUBDIRECTORY(lib)

在项目目录下创建build目录进行cmake
cmake -DCMAKE_INSTALL_PREFIX ..
make
没有错误的话就会在build/lib和proj4/lib下看到构建生成和安装的动态库和静态库,在proj4/include/hello找到hello.h
到这里我们都还没有运用静态库或者动态库编译生成可执行文件
接下来我们继续在当前的工程做实验运用静态库和动态库
我们在proj4下创建目录src,进入编写main.c

#include <hello.h>
int main() {
    HelloFunc();
    return 0;
}

我们把头文件和库文件都没有装到系统默认查找头文件和库文件目录下,这样直接编译肯定是会报错的,所以我们还是要通过cmake来控制的,我们修改工程目录下的CMakeLists.txt文件

PROJECT(HELLO)
#ADD_SUBDIRECTORY(lib) #这行注释掉,因为我们已经生成并安装过库文件了
ADD_SUBDIRECTORY(src,bin)

我们在src目录下编写CMakeLists.txt文件

SET(SRC_LIST "main.c")
INCLUDE_DIRECTORIES(项目绝对路径/include/hello) #项目绝对路径根据实际情况填写#添加查询头文件可选目录
LINK_DIRECTORIES(项目绝对路径/lib)    #添加查询库文件可选目录
ADD_EXECUTABLE(main ${SRC_LIST})
LINK_TARGET_LIBRARIES(main "libhello.a")    #给main链接libhello.a(同样也可以换成动态库)

猜你喜欢

转载自blog.csdn.net/rgbmarco/article/details/80242439