CMake中find_package功能演示

CMake中find_package功能演示

find_package可以被用来在系统中自动查找配置构建工程所需的程序库。在linux和unix类系统下这个命令尤其有用。CMake自带的模块文件里有大半是对各种常见开源库的find_package支持,支持库的种类非常多。

以下使用boost python的一个hello world例子的cmake构建文件为例,展示了如何使用find_package使用查找boost库和python库。这个例子需要使用最新的cmake版本2.6。


文件:boost_1_35_0/libs/python/example/tutorial/hello.cpp

// Copyright Joel de Guzman 2002-2004. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
// Hello World Example from the tutorial
// [Joel de Guzman 10/9/2002]

#include
#include

char const* greet()
{
return "hello, world";
}

BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}


文件:CMakeLists.txt

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)

project(hello)

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREAD ON)

#查找boost库中python的bind库
#REQUIRED表示如果没有找到,cmake会停止处理,并报告一个错误.
find_package( Boost 1.35 REQUIRED
COMPONENTS python)

#找到Boost后,变量Boost_INCLUDE_DIRS中将包括指定boost库头文件的查找路径.
#变量Boost_LIBRARY_DIRS中将包含指定boost库的.a或.so文件的所在目录的路径.
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

find_package(PythonLibs 2.5 REQUIRED)

add_library(hello SHARED
hello.cpp)

include_directories(${PYTHON_INCLUDE_PATH})

target_link_libraries(hello
debug ${Boost_PYTHON_LIBRARY_DEBUG}
optimized ${Boost_PYTHON_LIBRARY_RELEASE}
)

target_link_libraries(hello
debug ${PYTHON_DEBUG_LIBRARIES}
optimized ${PYTHON_LIBRARIES}
)


以上2个文件保存到同一目录即可。使用cmake-gui工具生成本地构建文件时,当完成configure后,打开Show Advanced Entries选项,即可看见Boost_PYTHON_LIBRARY_DEBUG、Boost_PYTHON_LIBRARY_RELEASE、PYTHON_DEBUG_LIBRARIES、PYTHON_LIBRARIES等变量的存在及其值。

因为gcc不支持写在代码文件中lib链接指令,boost库的自动连接在gcc中无效。构建时需要程序员自己去按照boost库文件的命名规则去指定要链接的库,这个很麻烦。在使用cmake的find_package后,这些麻烦的事都被省略掉了,而且不像人工指定那么容易出错,提高了生产力。

构建成功后应该生成libhello.so文件。使用命令ln libhello.so hello_ext.so -s 做个符号链接。
在终端输入命令python 进入python解释器。
Python 2.5.2 (r252:60911, May 7 2008, 15:19:09)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello_ext
>>> print hello_ext.greet()
hello, world
>>>



cmake支持查找的库很多,见下面。详细使用方式请查cmake文档。
# FindASPELL
# FindAVIFile
# FindBLAS
# FindBZip2
# FindBoost
# FindCABLE
# FindCURL
# FindCVS
# FindCups
# FindCurses
# FindCygwin
# FindDCMTK
# FindDart
# FindDoxygen
# FindEXPAT
# FindFLTK
# FindFLTK2
# FindFreetype
# FindGCCXML
# FindGDAL
# FindGIF
# FindGLUT
# FindGTK
# FindGettext
# FindGnuplot
# FindHSPELL
# FindHTMLHelp
# FindITK
# FindImageMagick
# FindJNI
# FindJPEG
# FindJasper
# FindJava
# FindKDE3
# FindKDE4
# FindLAPACK
# FindLATEX
# FindLibXml2
# FindLibXslt
# FindLua50
# FindLua51
# FindMFC
# FindMPEG
# FindMPEG2
# FindMPI
# FindMatlab
# FindMotif
# FindOpenAL
# FindOpenGL
# FindOpenSSL
# FindOpenThreads
# FindPHP4
# FindPNG
# FindPackageHandleStandardArgs
# FindPackageMessage
# FindPerl
# FindPerlLibs
# FindPhysFS
# FindPike
# FindPkgConfig
# FindProducer
# FindPythonInterp
# FindPythonLibs
# FindQt
# FindQt3
# FindQt4
# FindQuickTime
# FindRuby
# FindSDL
# FindSDL_image
# FindSDL_mixer
# FindSDL_net
# FindSDL_sound
# FindSDL_ttf
# FindSWIG
# FindSelfPackers
# FindSubversion
# FindTCL
# FindTIFF
# FindTclStub
# FindTclsh
# FindThreads
# FindUnixCommands
# FindVTK
# FindWget
# FindWish
# FindX11
# FindXMLRPC
# FindZLIB
# Findosg
# FindosgDB
# FindosgFX
# FindosgGA
# FindosgIntrospection
# FindosgManipulator
# FindosgParticle
# FindosgProducer
# FindosgShadow
# FindosgSim
# FindosgTerrain
# FindosgText
# FindosgUtil
# FindosgViewer
# FindwxWidgets
# FindwxWindows


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的示例,演示如何使用 CMake、find_package、install 和 CPack 工具来构建、打包和安装一个简单的 C++ 应用程序。 假设我们有一个名为 "hello" 的 C++ 应用程序,它依赖于 Boost 库和 OpenSSL 库。我们的目标是在 Linux 系统上构建、打包和安装这个应用程序。 1. 安装 Boost 和 OpenSSL 库: ``` sudo apt-get install libboost-all-dev libssl-dev ``` 2. 创建一个名为 CMakeLists.txt 的文件,描述构建过程: ``` cmake_minimum_required(VERSION 3.10) project(hello) # 查找 Boost 库 find_package(Boost REQUIRED COMPONENTS system) # 查找 OpenSSL 库 find_package(OpenSSL REQUIRED) # 添加可执行文件 add_executable(hello main.cpp) # 链接 Boost 和 OpenSSL 库 target_link_libraries(hello Boost::system OpenSSL::SSL OpenSSL::Crypto) # 安装可执行文件到 /usr/local/bin 目录下 install(TARGETS hello DESTINATION /usr/local/bin) # 使用 CPack 工具生成 DEB 软件包 set(CPACK_GENERATOR "DEB") set(CPACK_PACKAGE_NAME "hello") set(CPACK_PACKAGE_VERSION "1.0") set(CPACK_PACKAGE_DESCRIPTION "A simple hello world program") include(CPack) ``` 3. 创建一个名为 main.cpp 的文件,作为应用程序的源代码: ``` #include <iostream> #include <boost/asio.hpp> #include <openssl/ssl.h> int main() { std::cout << "Hello, world!" << std::endl; std::cout << "Boost version: " << BOOST_LIB_VERSION << std::endl; std::cout << "OpenSSL version: " << SSLeay_version(SSLEAY_VERSION) << std::endl; return 0; } ``` 4. 在项目根目录下创建一个名为 build 的文件夹,并进入该文件夹: ``` mkdir build cd build ``` 5. 运行 CMake 命令来生成构建文件: ``` cmake .. ``` 6. 运行 make 命令来构建应用程序: ``` make ``` 7. 运行 make install 命令来安装应用程序: ``` sudo make install ``` 8. 运行 CPack 命令来生成软件包: ``` cpack ``` 9. 在 build 目录下可以找到生成的软件包,例如 hello-1.0-Linux.deb。 这样,我们就成功地使用 CMake、find_package、install 和 CPack 工具来构建、打包和安装一个简单的 C++ 应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值