十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
cmake入门之一:编译、INSTALL及shell语句
cmake入门之二:调用外部共享库和头文件
此blog整理自cmake-practice,内容与book第五、六章基本一致,仅为了方便后续阅读。
1.创建外部共享库在~/cmake_demo
目录下创建ext
文件夹。
创建好的相关文件/文件夹目录如下:
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.txt1 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)
其中:
libhello.so
,即被调用的共享库;libhello_static.a
的静态库;libhello_static.a
会命名为libhello.a
的静态库;VERSION
指代动态库版本,SOVERSION
指代 API 版本;关于安装,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
目录下。
在~/cmake_demo
目录下创建peoject
文件夹。
创建好的项目目录树如下:
PROJECT(NewHello)
ADD_SUBDIRECTORY(src)
2.1.2 project目录下的src文件夹
2.1.2.1 main.c#includeint main()
{HelloFunc();
return 0;
}
该程序调用了上面那个项目中的hello.h
以及HelloFunc()
。
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)
其中:
hello.h
的搜索路径;libhello
共享库,以找到HelloFunc()
。分别执行以下命令:
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元起,快前往官网查看详情吧