【发布时间】:2015-04-20 06:21:38
【问题描述】:
我的项目中有 2 个文件夹“inc”和“lib”,它们分别有标题和静态库。如何告诉 cmake 分别使用这 2 个目录进行包含和链接?
【问题讨论】:
我的项目中有 2 个文件夹“inc”和“lib”,它们分别有标题和静态库。如何告诉 cmake 分别使用这 2 个目录进行包含和链接?
【问题讨论】:
最简单的方法是添加
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 或更高版本。
【讨论】:
link_directories(<dir>),正是要找的东西。
-L 标志添加到当前目录中的所有内容,但不会为链接到此目录中构建的库的其他目标添加。
可能无法使用链接目录,然后添加每个静态库,如下所示:
target_link_libraries(foo /path_to_static_library/libbar.a)
【讨论】:
你最好使用find_library 命令而不是link_directories。具体来说有两种方式:
在命令中指定路径
find_library(NAMES gtest PATHS path1 path2 ... pathN)
设置变量 CMAKE_LIBRARY_PATH
设置(CMAKE_LIBRARY_PATH 路径 1 路径 2)
find_library(NAMES gtest)
原因如flowings:
注意此命令很少需要,在有其他选择时应避免使用。更喜欢将完整的绝对路径传递给 在可能的情况下使用库,因为这样可以确保正确的库将 始终保持联系。 find_library() 命令提供完整路径, 通常可以直接在调用中使用 目标链接库()。库搜索路径可能存在的情况 需要的包括:项目生成器,如 Xcode,用户可以在其中 在构建时切换目标体系结构,但是到库的完整路径 不能使用,因为它只提供一种架构(即它是 不是通用二进制文件)。
库本身可能有其他私有库依赖项 期望通过 RPATH 机制找到,但某些链接器无法找到 完全解码这些路径(例如,由于存在诸如 $ORIGIN)。
如果必须提供库搜索路径,最好将库本地化 尽可能使用 target_link_directories() 命令产生效果 而不是 link_directories()。特定于目标的命令也可以 控制搜索目录如何传播到其他依赖 目标。
【讨论】: