【问题标题】:How do I add a library path in cmake?如何在 cmake 中添加库路径?
【发布时间】:2015-04-20 06:21:38
【问题描述】:

我的项目中有 2 个文件夹“inc”和“lib”,它们分别有标题和静态库。如何告诉 cmake 分别使用这 2 个目录进行包含和链接?

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    最简单的方法是添加

    include_directories(${CMAKE_SOURCE_DIR}/inc)
    link_directories(${CMAKE_SOURCE_DIR}/lib)
    
    add_executable(foo ${FOO_SRCS})
    target_link_libraries(foo bar) # libbar.so is found in ${CMAKE_SOURCE_DIR}/lib
    

    不向每个编译器调用添加 -I and -L 标志的现代 CMake 版本将使用导入的库:

    add_library(bar SHARED IMPORTED) # or STATIC instead of SHARED
    set_target_properties(bar PROPERTIES
      IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/lib/libbar.so"
      INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libbar"
    )
    
    set(FOO_SRCS "foo.cpp")
    add_executable(foo ${FOO_SRCS})
    target_link_libraries(foo bar) # also adds the required include path
    

    如果设置INTERFACE_INCLUDE_DIRECTORIES 不添加路径,旧版本的CMake 也允许您使用target_include_directories(bar PUBLIC /path/to/include)。但是,此 no longer works 使用 CMake 3.6 或更高版本。

    【讨论】:

    • 确实,我已经更新了我的答案,现在它适用于 CMake 3.8
    • link_directories(<dir>),正是要找的东西。
    • 虽然这适用于简单项目,但对于更复杂的构建系统很容易破坏,因此不再是添加链接器目录的推荐方法。问题是 link_directories() 会将-L 标志添加到当前目录中的所有内容,但不会为链接到此目录中构建的库的其他目标添加。
    • 这不再适用于 3.10.2 版本。使用'link_directories'时没有添加-L dir并且似乎没有目标属性
    • 感谢您提供 2 个解决方案。两者都对我有用。我很好奇,如果前者有效,为什么会引入/需要/首选后一种形式。谢谢!
    【解决方案2】:

    可能无法使用链接目录,然后添加每个静态库,如下所示:

    target_link_libraries(foo /path_to_static_library/libbar.a)
    

    【讨论】:

      【解决方案3】:

      你最好使用find_library 命令而不是link_directories。具体来说有两种方式:

      1. 在命令中指定路径

        find_library(NAMES gtest PATHS path1 path2 ... pathN)

      2. 设置变量 CMAKE_LIBRARY_PATH

        设置(CMAKE_LIBRARY_PATH 路径 1 路径 2)
        find_library(NAMES gtest)

      原因如flowings:

      注意此命令很少需要,在有其他选择时应避免使用。更喜欢将完整的绝对路径传递给 在可能的情况下使用库,因为这样可以确保正确的库将 始终保持联系。 find_library() 命令提供完整路径, 通常可以直接在调用中使用 目标链接库()。库搜索路径可能存在的情况 需要的包括:项目生成器,如 Xcode,用户可以在其中 在构建时切换目标体系结构,但是到库的完整路径 不能使用,因为它只提供一种架构(即它是 不是通用二进制文件)。

      库本身可能有其他私有库依赖项 期望通过 RPATH 机制找到,但某些链接器无法找到 完全解码这些路径(例如,由于存在诸如 $ORIGIN)。

      如果必须提供库搜索路径,最好将库本地化 尽可能使用 target_link_directories() 命令产生效果 而不是 link_directories()。特定于目标的命令也可以 控制搜索目录如何传播到其他依赖 目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 2019-12-08
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多