工程描述
1,建立一个静态库和动态库,提供HelloFunc 函数供其他程序编程使用,HelloFunc
向终端输出Hello World字符串。
2,安装头文件与共享库。
1 库的工程结构
1.1 工程目录下的CMakeLists.txt
PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
1.2 lib 目录下的CMakeLists.txt
SET(LIBHELLO_SRC hello.c)
# 注意生成动态库和静态库的名称要做区分,hello作为target不能被重命名
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
# 将静态库的名称重新命名为hello,达到生成 libhello.so libhello.a的效果
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
# 打印重命名的静态库的名称
# GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)
# MESSAGE(STATUS "This is the hello_static OUTPUT_NAME:" ${OUTPUT_VALUE})
# cmake在构建新的target时,会清理掉同名的旧的target, 此处设置防止生成的target被清理掉
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
# 设置动态库版本号
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
# 安装静态库、动态库、头文件
INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include)
1.3 编译目录下执行cmake
编译完成后的build目录结构(注意编译之前build是空目录,编译完成后生成的目标文件和中间文件都放置在bulid目录下)
1.4 生成的安装目录结构
2 主调程序的工程结构
main.c
#include <hello.h>
int main()
{
HelloFunc();
return 0;
}
2.1 工程目录下的CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
PROJECT(NEWHELLO)
ADD_SUBDIRECTORY(src)
2.2 src 目录下的CMakeLists.txt
ADD_EXECUTABLE(main main.c)
# 添加依赖库的头文件路径
INCLUDE_DIRECTORIES(/tmp/t3/usr/include)
# 添加依赖库的路径,这个地方添加依赖库的搜索路径,在执行make是提示找不到,不解。。
# 最后没办法做了一个软链接到/usr/lib64
#LINK_DIRECTORIES(/tmp/t3/usr/lib)
# 添加搜索库的名称
TARGET_LINK_LIBRARIES(main hello)