兰州网站制作公司怎么样,北京公司注销流程,产品营销策划方案,效果图制作网站如果编译软件使用了外部库#xff0c;事先并不知道它的头文件和链接库的位置。得在编译命令中加上包含它们的查找路径。CMake使用 find_package#xff08;#xff09;命令来解决这个问题。本文讨论了find_package#xff08;#xff09;的工作原理。
一、find_package()…如果编译软件使用了外部库事先并不知道它的头文件和链接库的位置。得在编译命令中加上包含它们的查找路径。CMake使用 find_package命令来解决这个问题。本文讨论了find_package的工作原理。
一、find_package()的查找*.cmake的顺序
1、 find_package(Name)命令首先会在模块路径中寻找 Findname.cmake这是查找库的一个典型方式。具体查找路径依次为CMake 变量${CMAKE_MODULE_PATH}中的所有目录。如果没有然后再查看它自己的模块目录 /share/cmake-x.y/Modules/ $CMAKE_ROOT的具体值可以通过CMake中message命令输出。这称为模块模式。
2、 如果没找到这样的文件find_package()会在~/.cmake/packages/或/usr/local/share/中的各个包目录中查找寻找库名字的大写Config.cmake 或者 库名字的小写-config.cmake (比如库Opencv它会查找/usr/local/share/OpenCV中的OpenCVConfig.cmake或opencv-config.cmake)。**这称为配置模式。
**不管使用哪一种模式只要找到*.cmake*.cmake里面都会定义下面这些变量
NAME_FOUND
NAME_INCLUDE_DIRS or NAME_INCLUDES
NAME_LIBRARIES or NAME_LIBRARIES or NAME_LIBS
NAME_DEFINITIONS
注意大部分包的这些变量中的包名是全大写的如 LIBFOO_FOUND 有些包则使用包的实际大小写如 LibFoo_FOUND 如果找到这个包则可以通过在工程的顶层目录中的CMakeLists.txt 文件添加 include_directories(NAME_INCLUDE_DIRS) 来包含库的头文件添加target_link_libraries(源文件 NAME_LIBRARIES)命令将源文件与库文件链接起来。
二、使用外部库的方式 为了能支持各种常见的库和包CMake自带了很多模块。可以通过命令 cmake --help-module-list 得到你的CMake支持的模块的列表或者直接查看模块路径。比如Ubuntu上模块的路径是 /usr/share/cmake/Modules/ 。 让我们以bzip2库为例。CMake中有个FindBZip2.cmake 模块。只要使用 find_package(BZip2) 调用这个模块cmake会自动给一些变量赋值然后就可以在CMakelists.txt中使用它们了。变量的列表可以查看cmake模块文件或者使用命令 cmake –help-module FindBZip2 。
比如一个使用bzip2的简单程序编译器需要知道 bzlib.h 的位置链接器需要找到bzip2库动态链接的话Unix上是 libbz2.so 类似的文件Windows上是 libbz2.dll 。
cmake_minimum_required(VERSION 2.8)
project(helloworld)
add_executable(helloworld hello.c)
find_package(BZip2)
if (BZIP2_FOUND)include_directories(${BZIP_INCLUDE_DIRS})target_link_libraries (helloworld ${BZIP2_LIBRARIES})
endif (BZIP2_FOUND) 可以用 cmake 和 make VERBOSE1 来验证传给编译器和链接器的flag是否正确。也可以用ldd或者dependency walker之类的工具在编译后验证 helloworld 链接的文件。