CMake 初探

今天兴致勃勃地写了一些自己的底层socket库代码,用到了uriparser#include <uriparser/Uri.h>,在CmakeLists.txt里写了find_package(UriParser)然而在跑cmake时却说找不到这个库,我一直对cmake是怎么找链接库不太了解,刚好趁这个机会研究一下。
首先我很好奇的是我以前用到了boostgtest,都是直接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})即可。