使用 cmake
同时编译出静态和动态库文件
ADD_LIBRARY( ${name} SHARED ${ARGN} )
编译动态库ADD_LIBRARY(MyLibStatic STATIC source1.c source2.c)
编译静态库
ADD_LIBRARY
原型
ADD_LIBRARY(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
ADD_LIBRARY
可以指定 STATIC
、 SHARED
或 MODULE
三种类型之一,如果没有类型被显式指定,这个选项将会根据变量 BUILD_SHARED_LIBS
的当前值是否为真决定是 STATIC
还是 SHARED
# User-configurable options
SET(BUILD_SHARED_LIBS OFF CACHE BOOL
"Build shared libraries instead of static ones.")
FUNCTION(ADD_N_LIBRARY name)
# 生成动态库目标
IF (OS STREQUAL LINUX)
ADD_LIBRARY( ${name} SHARED ${ARGN} )
SET_TARGET_PROPERTIES(${name} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(${name} PROPERTIES VERSION 1.0 SOVERSION 1)
INSTALL( TARGETS ${name} LIBRARY DESTINATION ${PATH}/lib/share)
ENDIF()
# 生成静态库目标
ADD_LIBRARY( ${name}_static ${ARGN} )
# 指定静态库的输出名称
SET_TARGET_PROPERTIES(${name}_static PROPERTIES OUTPUT_NAME ${name})
SET_TARGET_PROPERTIES(${name}_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
INSTALL( TARGETS ${name}_static ARCHIVE DESTINATION ${PATH}/lib)
ENDFUNCTION(ADD_N_LIBRARY name)
注意生成静态库时不能使用与动态库一样的名字,例如 ADD_LIBRARY( ${name} ${ARGN} )
,重名会导致静态构建失效。而我们需要静态与动态同名,需要使用 SET_TARGET_PROPERTIES
用来设置输出的名称,对于动态库,还可以用来指定动态库版本
SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
VERSION
指代动态库版本, SOVERSION
指代 API 版本