教程: 依赖配置
该页面讲述如何配置和检查依赖项。
依赖项配置
依赖项的配置文件为cmake/${project-name}_deps.cmake。依赖项请在此配置。
KMCMAKE_SYSTEM_DYLINK
该配置项是kmcmake根据系统自动检测的系统库,对用linux系统上的pthread,rt,dl三个库。
目前支持平台包括macos和linux。
KMCMAKE_DEPS_LINK
kmcmake使用${KMCMAKE_DEPS_LINK}变量存储本库所依赖的所有库。所有的依赖都加入到该变量中。
依赖配置步骤
- 使用cmake函数查找依赖的库
- 将依赖库添加到
${KMCMAKE_DEPS_LINK}中
info
kumo体系的库都可以使用find_package查找相应的库。并且规范为find_package(some_lib REQUIRED)。
所有的库都会导出some_lib::some_module_static和some_lib::some_module_shared。
find_package
find_package是cmake提供的函数,find_package(some_lib REQUIRED)检查库是否存在。每个库的写法并不
固定,如gtest为
find_package(GTest REQUIRED)
导出GTest::gtest, GTest::gtest_main, GTest::gmock, GTest::gmock_main。
而turbo为
find_package(turbo REQUIRED)
导出turbo::turbo_static以及turbo::turbo_shared。
kumo自研的库都可以按照turbo的形式使用,这是Kumo的规范,第三方库,请查阅相应的资料。
示例:
添加turbo依赖
- deps.cmake
- CMakeLists.txt
...
find_package(Threads REQUIRED)
find_package(turbo REQUIRED)
############################################################
#
# add you libs to the KMCMAKE_DEPS_LINK variable eg as turbo
# so you can and system pthread and rt, dl already add to
# KMCMAKE_SYSTEM_DYLINK, using it for fun.
##########################################################
set(KMCMAKE_DEPS_LINK
turbo::turbo_static
${KMCMAKE_SYSTEM_DYLINK}
)
...
kmcmake_cc_library(
NAMESPACE ${PROJECT_NAME}
NAME foo
SOURCES
foo.cc
CXXOPTS
${KMCMAKE_CXX_OPTIONS}
PLINKS
${KMCMAKE_DEPS_LINK}
PUBLIC
)
find_library
find_package依赖于cmake的对象导出,某些第三方库并不是cmake构建,或者cmake构建但是并未导出相应的
对象,此时cmake提供了find_library方法来查找库。
参数:
- OUTPUT_VAR 导出的变量,如果查找的库存在,此变量实际存储的是库的路径
- NAMES 库文件名 如
turbo,cmake会自动为您扩展为libturbo.solibturbo.a。如果输入为libturbo.a,系统不会扩展。 其他平台的库cmake会自动为您扩展为该平台的扩展名。 - HINTS 最优先查找的路径
- PATHS 查找路径
示例:
find_library(GFLAGS_STATIC_LIB NAMES libgflags.a)
判断是否找到
if(NOT GFLAGS_STATIC_LIB)
message(STATUS "not find gflags library")
else()
message(STATUS "find gflags library at: ${GFLAGS_STATIC_LIB}")
endif()
完整示例:
- deps.cmake
- CMakeLists.txt
...
find_package(Threads REQUIRED)
find_library(GFLAGS_STATIC_LIB NAMES libgflags.a)
if(NOT GFLAGS_STATIC_LIB)
message(FATAL_ERROR "not find gflags library")
else()
message(STATUS "find gflags library at: ${GFLAGS_STATIC_LIB}")
endif()
############################################################
#
# add you libs to the KMCMAKE_DEPS_LINK variable eg as turbo
# so you can and system pthread and rt, dl already add to
# KMCMAKE_SYSTEM_DYLINK, using it for fun.
##########################################################
set(KMCMAKE_DEPS_LINK
${GFLAGS_STATIC_LIB}
${KMCMAKE_SYSTEM_DYLINK}
)
...
kmcmake_cc_library(
NAMESPACE ${PROJECT_NAME}
NAME foo
SOURCES
foo.cc
CXXOPTS
${KMCMAKE_CXX_OPTIONS}
PLINKS
${KMCMAKE_DEPS_LINK}
PUBLIC
)