CMake 初探
今天兴致勃勃地写了一些自己的底层socket库代码,用到了uriparser#include <uriparser/Uri.h>
,在CmakeLists.tx
t里写了find_package(UriParser)
然而在跑cmake时却说找不到这个库,我一直对cmake是怎么找链接库不太了解,刚好趁这个机会研究一下。
首先我很好奇的是我以前用到了boost
和gtest
,都是直接find_package
就找到了,为什么这次不行呢。原来cmake会先在自带的模块查找,这个模块路径一般是/usr/share/cmake/Modules
。拿Gtest来说,cmake有FindGtest.cmake
在上述路径,所以每当我们使用find_package
时,他就会调用这个模块找到外部库。
那么对于没有自带模块的外部库要如何查找呢。我们需要自己写一个Findxxx.cmake
,或者在网上找一找看有没有人写好。我是在网上找了一份,因为自己不会
# Find the UriParser library
# Defines:
# URIPARSER_INCLUDE_DIR - uriparser include directory
# URIPARSER_LIBRARY - uriparser library file
# URIPARSER_FOUND - TRUE if uriparser is found
if (URIPARSER_INCLUDE_DIR)
#check cache
set(URIPARSER_FIND_QUIETLY TRUE)
endif ()
if (NOT URIPARSER_INCLUDE_DIR)
find_path(URIPARSER_INCLUDE_DIR NAMES Uri.h PATH_SUFFIXES uriparser)
set(URIPARSER_INCLUDE_DIR ${URIPARSER_INCLUDE_DIR}/uriparser CACHE PATH "uriparser includes")
endif ()
find_library(URIPARSER_LIBRARY NAMES uriparser)
if (URIPARSER_INCLUDE_DIR AND URIPARSER_LIBRARY)
set(URIPARSER_FOUND TRUE)
set(UriParser_FOUND TRUE)
endif ()
if (URIPARSER_FOUND)
if (NOT URIPARSER_FIND_QUIETLY)
message(STATUS "Found UriParser library: ${URIPARSER_LIBRARY}")
endif ()
else ()
if (NOT URIPARSER_FIND_QUIETLY)
message(FATAL_ERROR "Could NOT find UriParser library")
else ()
message(STATUS "Could NOT find UriParser library")
endif ()
endif ()
然后将这个文件放在proj/cmake
下, 然后再CMakeLists.txt里定义
set(CMAKE_MODULE_PATH
${CMAKE_SOURCE_DIR}/cmake
${CMAKE_MODULE_PATH})
在需要使用uriparser的子项目CMakeLists.txt中定义target_link_libraries(subproj PUBLIC ${URIPARSER_LIBRARY})
即可。