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入门之二:调用外部共享库和头文件
此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
#include<stdio.h>
void 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
#include <hello.h>
int 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



















