如何在cmake中添加库路径?

124

我在项目中有两个文件夹 "inc" 和 "lib",分别包含头文件和静态库。如何告诉 cmake 使用这两个目录分别进行包含和链接?

3个回答

182

最简单的方法是添加:

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和-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)。但是,这在CMake 3.6或更新版本中不再起作用

1
确实,我已经更新了我的回答,现在它可以在CMake 3.8上运行。 - ar31
7
link_directories(<dir>) 正是您所需要的。 - parasrish
9
虽然这种方法对于简单的项目是可行的,但在更复杂的构建系统中很容易出现问题,因此不再推荐使用这种方式来添加链接器目录。问题在于 link_directories() 会向当前目录中的所有内容添加 "-L" 标志,但对于链接到在该目录中构建的库的其他目标,该标志将不会被添加。 - ar31
2
这在3.10.2版本中不再起作用。使用'link_directories'时没有添加-L目录,而且似乎没有目标属性。 - Lothar
1
谢谢提供两种解决方案。两种都对我有用。我很好奇为什么要介绍/需要/更喜欢后一种形式,如果前一种形式已经可以工作。谢谢! - HCSF
显示剩余10条评论

11
你最好使用find_library命令而不是link_directories。具体来说,有两种方法:
  1. 在命令中指定路径

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

  2. 设置变量CMAKE_LIBRARY_PATH

    set(CMAKE_LIBRARY_PATH path1 path2)
    find_library(NAMES gtest)

原因如下

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

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

如果必须提供库搜索路径,请尽可能使用target_link_directories()命令将效果局限在本地,而不是使用link_directories()。目标特定命令还可以控制搜索目录如何传播到其他依赖目标。


11

如果使用link_directories无法正常工作,则可以按照以下方式添加每个静态库:

target_link_libraries(foo /path_to_static_library/libbar.a)

1
link_directories 函数并没有实际作用,所以这个答案对我来说是正确的。 - jjxtra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接