cmake中使用find_package时,源库在编译时会把INCLUDE_DIR存在哪里
时间: 2023-05-31 19:05:12 浏览: 59
在使用find_package查找外部库时,库的头文件路径会被存储在变量中,该变量的名称通常为库名的大写字母加上下划线和INCLUDE_DIR,例如对于OpenCV库,其头文件路径的变量名为OPENCV_INCLUDE_DIR。该变量可以在CMakeLists.txt文件中使用,例如:
```cmake
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
```
在上面的例子中,使用find_package查找OpenCV库后,可以通过引用变量${OpenCV_INCLUDE_DIRS}来指定OpenCV库的头文件路径,从而在编译时正确地包含OpenCV库的头文件。
相关问题
使用cmake写一个可被其他cmake文件find_package()调用的包
要编写一个可被其他 CMake 文件 `find_package()` 调用的包,需要完成以下步骤:
1. 创建一个文件夹用于存放你的包,例如 `MyPackage`。
2. 在 `MyPackage` 文件夹中创建 `CMakeLists.txt` 文件,用于编写构建逻辑。
3. 在 `MyPackage` 文件夹中创建一个 `MyPackageConfig.cmake.in` 文件,该文件定义了包的名称、版本号、安装路径等信息。
4. 在 `MyPackage` 文件夹中创建一个 `MyPackageTargets.cmake` 文件,该文件定义了包的编译目标。
5. 在 `MyPackage` 文件夹中创建一个 `include` 文件夹,用于存放包的公共头文件。
6. 在 `MyPackage` 文件夹中创建一个 `src` 文件夹,用于存放包的源代码。
下面是一个示例 `CMakeLists.txt` 文件:
```cmake
cmake_minimum_required(VERSION 3.5)
project(MyPackage VERSION 1.0.0 LANGUAGES CXX)
# 设置包的安装路径
if(NOT CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Install path prefix" FORCE)
endif()
# 添加头文件路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# 添加源码路径
add_subdirectory(src)
# 安装包的配置文件
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/MyPackageConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfig.cmake"
@ONLY
)
# 安装包的配置文件和版本文件
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfigVersion.cmake"
DESTINATION lib/cmake/MyPackage
)
# 安装包的公共头文件
install(
DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}/include/"
DESTINATION include
)
# 导出包的编译目标
install(
EXPORT MyPackageTargets
FILE MyPackageTargets.cmake
NAMESPACE MyPackage::
DESTINATION lib/cmake/MyPackage
)
```
`MyPackageConfig.cmake.in` 文件示例:
```cmake
@PACKAGE_INIT@
set_and_check(MYPACKAGE_INCLUDE_DIR "@PACKAGE_INCLUDE_DIR@")
set_and_check(MYPACKAGE_LIBRARY_DIR "@PACKAGE_LIBRARY_DIR@")
set_and_check(MYPACKAGE_LIBRARIES "@PACKAGE_LIBRARIES@")
set_and_check(MYPACKAGE_VERSION "@PACKAGE_VERSION@")
include("${CMAKE_CURRENT_LIST_DIR}/MyPackageTargets.cmake")
# 导出包的头文件路径和编译目标
set(MYPACKAGE_INCLUDE_DIRS "${MYPACKAGE_INCLUDE_DIR}")
set(MYPACKAGE_TARGETS MyPackage::MyPackage)
# 导出包的版本信息
set(MYPACKAGE_VERSION_MAJOR "@PACKAGE_VERSION_MAJOR@")
set(MYPACKAGE_VERSION_MINOR "@PACKAGE_VERSION_MINOR@")
set(MYPACKAGE_VERSION_PATCH "@PACKAGE_VERSION_PATCH@")
set(MYPACKAGE_VERSION "${MYPACKAGE_VERSION_MAJOR}.${MYPACKAGE_VERSION_MINOR}.${MYPACKAGE_VERSION_PATCH}")
```
`MyPackageTargets.cmake` 文件示例:
```cmake
add_library(MyPackage::MyPackage INTERFACE IMPORTED)
set_target_properties(MyPackage::MyPackage PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${MYPACKAGE_INCLUDE_DIR}"
INTERFACE_LINK_DIRECTORIES "${MYPACKAGE_LIBRARY_DIR}"
)
target_link_libraries(MyPackage::MyPackage INTERFACE "${MYPACKAGE_LIBRARIES}")
```
完成上述步骤后,你的包就可以被其他 CMake 文件 `find_package()` 调用了。例如,在其他项目中使用该包的方法如下:
```cmake
find_package(MyPackage REQUIRED)
# 使用 MyPackage 的头文件和库
target_include_directories(my_target PUBLIC ${MyPackage_INCLUDE_DIRS})
target_link_libraries(my_target PUBLIC MyPackage::MyPackage)
```
Cmake find_package引入zeromq
要在 CMake 中引入 ZeroMQ,可以按照以下步骤进行操作:
1. 首先,你需要在系统中安装 ZeroMQ。可以通过以下命令在 Ubuntu 上安装:
```
sudo apt-get install libzmq3-dev
```
或者从 ZeroMQ 官网下载源代码进行编译安装。
2. 在 CMakeLists.txt 中使用 `find_package` 命令来查找 ZeroMQ:
```
find_package(PkgConfig REQUIRED)
pkg_check_modules(PC_ZeroMQ QUIET zmq)
find_path(ZeroMQ_INCLUDE_DIR
NAMES zmq.hpp
PATHS ${PC_ZeroMQ_INCLUDE_DIRS})
find_library(ZeroMQ_LIBRARY
NAMES zmq
PATHS ${PC_ZeroMQ_LIBRARY_DIRS})
target_include_directories(your_project_name PRIVATE ${ZeroMQ_INCLUDE_DIR})
target_link_libraries(your_project_name PRIVATE ${ZeroMQ_LIBRARY})
```
以上代码会先使用 `pkg_check_modules` 命令来查找 ZeroMQ,然后在找到的路径中查找头文件和库文件,并将它们添加到你的项目中。
3. 在你的源代码中使用 `#include <zmq.hpp>` 来引入 ZeroMQ 头文件,并使用 `zmq` 命名空间来访问 ZeroMQ 相关的函数和类。
这样就可以在你的 CMake 项目中成功使用 ZeroMQ 了。