cmake链接动态库和静态库的写法

时间:2025-03-15 09:34:31

1.动态库链接

(1)链接动态库的第一种写法

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../ThirdPartyLib)

add_executable(${PROJECT_NAME}
               ${ALL_SOURCES}
               ${ALL_INCLUDES}
)

target_link_libraries(${PROJECT_NAME}
    srtp2
    # -lsrtp2 #前面也可以加-l
)

这种写法要求link_directories、add_executable、target_link_libraries的顺序必须是这样的先后关系

(2) 链接动态库的第2种写法

find_library(srtp2Lib srtp2 HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../ThirdPartyLib)

add_executable(${PROJECT_NAME}
               ${ALL_SOURCES}
               ${ALL_INCLUDES}
)

target_link_libraries(${PROJECT_NAME}
                       ${srtp2Lib}
)

这种写法find_library和add_executable是没有先后顺序的,而且在cmake的编译阶段就可以检查出是否能在对应的目录找到srtp2的库,推荐使用这种方式

2.静态库链接

(1)下面是链接静态库的第一种写法

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../ThirdPartyLib)

add_executable(${PROJECT_NAME}
               ${ALL_SOURCES}
               ${ALL_INCLUDES}
)

target_link_libraries(${PROJECT_NAME}
    srtp2
    # -lsrtp2 #前面也可以加-l
    #  #可以明确指定静态库
)

和链接动态库的写法是一模一样的。以linux系统下为例子,target_link_libraries里面链接的库,实际上会自动查找或 文件,但是若.so文件和.a文件在指定同时存在,那么.so文件优先,但是若明确指定为 ,那么便链接的是静态库

(2)链接静态库的第2种写法

find_library(srtp2Lib srtp2 HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../ThirdPartyLib)
# find_library(srtp2Lib  HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../ThirdPartyLib)

add_executable(${PROJECT_NAME}
               ${ALL_SOURCES}
               ${ALL_INCLUDES}
)

target_link_libraries(${PROJECT_NAME}
                       ${srtp2Lib}
)

和链接动态库的第2种写法一模一样。同样find_library查找时,.so文件优先,但是也是可以明确指定查找文件

(3) 链接静态库的第3种写法

link_libraries(${CMAKE_CURRENT_SOURCE_DIR}/lib/)

add_executable(${PROJECT_NAME}

               ${ALL_SOURCES}

               ${ALL_INCLUDES}

)

这种方法是采用link_libraries指令链接静态库,link_libraries必须在add_executable指令之前调用,link_libraries是比较古老的指令了,不推荐这种写法