资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

cmake入门之二:调用外部共享库和头文件-创新互联

cmake入门之二:调用外部共享库和头文件
  • 1.创建外部共享库
    • 1.1 创建相关文件或文件夹
      • 1.1.1 ext目录下的CMakeLists.txt
      • 1.1.2 ext目录lib文件夹下
        • 1.1.2.1 hello.h
        • 1.1.2.2 hello.c
        • 1.1.2.3 CMakeLists.txt
    • 1.2 编译、安装
  • 2.创建当前项目
    • 2.1 创建相关文件或文件夹
      • 2.1.1 project目录下的CMakeLists.txt
      • 2.1.2 project目录下的src文件夹
        • 2.1.2.1 main.c
        • 2.1.2.2 CMakeLists.txt
    • 2.2 编译
  • 参考文献

cmake入门之一:编译、INSTALL及shell语句
cmake入门之二:调用外部共享库和头文件

成都创新互联网站建设公司提供网站设计和自适应建站服务。团队由有经验的网页设计师、程序员和市场专家组成,能够提供从H5网站设计,网站制作,一元广告,模板建站到重庆小程序开发公司等全方位服务。 以客户为中心,致力于为客户提供创新、高效的解决方案,帮助您打造成功的企业网站。

此blog整理自cmake-practice,内容与book第五、六章基本一致,仅为了方便后续阅读。

1.创建外部共享库

~/cmake_demo目录下创建ext文件夹。

1.1 创建相关文件或文件夹

创建好的相关文件/文件夹目录如下:
在这里插入图片描述

1.1.1 ext目录下的CMakeLists.txt
PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
1.1.2 ext目录lib文件夹下 1.1.2.1 hello.h
#ifndef HELLO_H
#define HELLO_H
#includevoid HelloFunc();
#endif
1.1.2.2 hello.c
#include "hello.h"
void HelloFunc()
{printf("Hello World!\n");
}
1.1.2.3 CMakeLists.txt
1 SET(LIBHELLO_SRC hello.c)
  2 ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
  3 ADD_LIBRARY(hello_static  STATIC ${LIBHELLO_SRC})
  4 SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
  5 GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)
  6 message(STATUS "This is the hello_static OUTPUT_NAME:"${OUTPUT_VALUE})
  7 SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
  8 INSTALL (TARGETS hello hello_static
  9         LIBRARY DESTINATION lib
 10         ARCHIVE DESTINATION lib)
 11 INSTALL(FILES hello.h DESTINATION include/hello)

其中:

  • 第2句编译后生成libhello.so,即被调用的共享库;
  • 第3句用于构建一个libhello_static.a的静态库;
  • 第4句用于设置输出的名称,即libhello_static.a会命名为libhello.a的静态库;
  • 第5/6句用于获取属性并打印信息;
  • 第7句用于设置动态库版本号,其中VERSION指代动态库版本,SOVERSION指代 API 版本;
  • 第8-10为分别安装共享库与静态库;
  • 第11句为安装头文件。

关于安装,cmake-practice书中还给出了一个示例,方便学习:

INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录
1.2 编译、安装

分别执行以下命令:

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
sudo make install

最后一步显示结果为:

-- Install configuration: ""
-- Installing: /usr/lib/libhello.so.1.2
-- Up-to-date: /usr/lib/libhello.so.1
-- Up-to-date: /usr/lib/libhello.so
-- Installing: /usr/lib/libhello.a
-- Up-to-date: /usr/include/hello/hello.h

可见hello.h及共享库、静态库均正常安装了。

注意:为了保证接下来操作能正常调用,必须安装在/usr目录下。

2.创建当前项目

~/cmake_demo目录下创建peoject文件夹。

2.1 创建相关文件或文件夹

创建好的项目目录树如下:
在这里插入图片描述

2.1.1 project目录下的CMakeLists.txt
PROJECT(NewHello)
ADD_SUBDIRECTORY(src)
2.1.2 project目录下的src文件夹 2.1.2.1 main.c
#includeint main()
{HelloFunc();
        return 0;
}

该程序调用了上面那个项目中的hello.h以及HelloFunc()

2.1.2.2 CMakeLists.txt
1 ADD_EXECUTABLE(main main.c)
  2 INCLUDE_DIRECTORIES(/usr/include/hello)
  3 TARGET_LINK_LIBRARIES(main hello)
  4 #或者 TARGET_LINK_LIBRARIES(main libhello.so)

其中:

  • 第1句作用是生成可执行文件;
  • 第2句添加头文件hello.h的搜索路径;
  • 第3、4句将目标文件链接到libhello共享库,以找到HelloFunc()
2.2 编译

分别执行以下命令:

mkdir build
cd build
cmake ..
make
 ./src/main 
#Hello World!

正常打印Hello World!,说明调用成功!

查看main的链接情况

ldd src/main
#	linux-vdso.so.1 (0x00007fffa9afb000)
#	libhello.so.1 =>/usr/lib/libhello.so.1 (0x00007f18035d4000)
#	libc.so.6 =>/lib/x86_64-linux-gnu/libc.so.6 (0x00007f18031e3000)
#	/lib64/ld-linux-x86-64.so.2 (0x00007f18039d8000)

可见正常链接到了共享库libhello.so.1

另外,还可以修改命令以链接到静态库:

TARGET_LINK_LIBRARIES(main libhello.a)
参考文献

[1] cmake-practice
[2] cmake-rules
[3] dev-cafe/cmake-cookbook

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页名称:cmake入门之二:调用外部共享库和头文件-创新互联
链接地址:http://cdkjz.cn/article/dgpggs.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220