代码之家  ›  专栏  ›  技术社区  ›  MateuszL

Cmake find模块区分共享库还是静态库

  •  1
  • MateuszL  · 技术社区  · 6 年前

    here

    find_library(CryptoPP_LIBRARY
      NAMES cryptopp
      DOC "CryptoPP library"
      NO_PACKAGE_ROOT_PATH
      PATHS "/usr/lib/x86_64-linux-gnu/"
    )
    ...
    add_library(CryptoPP::CryptoPP UNKNOWN IMPORTED)
    set_target_properties(CryptoPP::CryptoPP PROPERTIES
        IMPORTED_LOCATION "${CryptoPP_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${CryptoPP_INCLUDE_DIR}")
    

    这很好,可以找到静态库文件(*.a)。现在我想创建单独的目标CryptoPP::CryptoPP static和CryptoPP::CryptoPP shared。 已安装必要的文件(默认的ubuntu安装):

    • /usr/lib/x86_-linux-gnu/libcryptopp.a

    我想知道如何告诉find_library搜索静态或共享版本(最好是以可移植的方式-我需要所有的Linux、Windows、MacOS)并指定创建的目标类型。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Florian    6 年前

    实际上,CMake的默认设置是先搜索共享库,然后搜索静态库。

    关键是值在 CMAKE_FIND_LIBRARY_SUFFIXES 全局变量,例如设置在 CMakeGenericSystem.cmake project() 命令到:

    set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
    

    对于解决方案,请查看现有的find模块,如 FindBoost.cmake

    # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
    if( Boost_USE_STATIC_LIBS )
      set( _boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
      if(WIN32)
        list(INSERT CMAKE_FIND_LIBRARY_SUFFIXES 0 .lib .a)
      else()
        set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
      endif()
    endif()
    

    在这里 CMAKE\u FIND\u LIBRARY\u后缀 变量临时更改为 find_library() 电话。

    在这里也应该如此。只是要注意 查找库() 如果要执行两次相同的搜索,则缓存其结果。

    工具书类