我在项目中有两个文件夹 "inc" 和 "lib",分别包含头文件和静态库。如何告诉 cmake 使用这两个目录分别进行包含和链接?
最简单的方法是添加:
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或更新版本中不再起作用。在命令中指定路径
find_library(NAMES gtest PATHS path1 path2 ... pathN)
设置变量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()。目标特定命令还可以控制搜索目录如何传播到其他依赖目标。
如果使用link_directories无法正常工作,则可以按照以下方式添加每个静态库:
target_link_libraries(foo /path_to_static_library/libbar.a)
link_directories(<dir>)
正是您所需要的。 - parasrish