我有2个文件夹" inc"和" lib"在我的项目中分别有头文件和静态库。如何告诉cmake分别使用这两个目录进行包含和链接?
答案 0 :(得分:52)
最简单的方法是添加
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或更新。
答案 1 :(得分:2)
可能无法使用link_directories,然后添加每个静态库,如下所示:
target_link_libraries(foo /path_to_static_library/libbar.a)
答案 2 :(得分:1)
您最好使用 find_library 命令而不是 link_directories。具体来说有两种方式:
在命令中指定路径
find_library(NAMES gtest PATHS path1 path2 ... pathN)
设置变量 CMAKE_LIBRARY_PATH
设置(CMAKE_LIBRARY_PATH path1 path2)
find_library(NAMES gtest)
原因是flowings:
<块引用>注意此命令很少需要,应避免在有其他选择的情况下使用。更喜欢将完整的绝对路径传递给 在可能的情况下使用库,因为这可以确保正确的库 始终保持联系。 find_library() 命令提供完整路径, 通常可以直接用于调用 target_link_libraries()。库搜索路径可能位于的情况 需要的包括:项目生成器,如 Xcode,用户可以 在构建时切换目标架构,但要切换到库的完整路径 不能使用,因为它只提供一种架构(即它是 不是通用二进制文件)。
库本身可能有其他私有库依赖项 期望通过 RPATH 机制找到,但某些链接器不能 完全解码这些路径(例如,由于存在诸如 $ORIGIN)。
如果必须提供库搜索路径,请优先本地化 在可能的情况下使用 target_link_directories() 命令实现效果 而不是 link_directories()。特定于目标的命令也可以 控制搜索目录如何传播到其他依赖 目标。