0%

使用 cmake 同时生成静态和动态库

使用 cmake 同时编译出静态和动态库文件

  1. ADD_LIBRARY( ${name} SHARED ${ARGN} ) 编译动态库
  2. ADD_LIBRARY(MyLibStatic STATIC source1.c source2.c) 编译静态库

ADD_LIBRARY 原型

ADD_LIBRARY(<name> [STATIC | SHARED | MODULE]
              [EXCLUDE_FROM_ALL]
              source1 source2 ... sourceN)

ADD_LIBRARY 可以指定 STATICSHAREDMODULE 三种类型之一,如果没有类型被显式指定,这个选项将会根据变量 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 版本