CMake构建学习笔记8-OpenSceneGraph库的构建
1. 概论
在连续构建了zlib、libpng、libjpeg、libtiff、giflib以及freetype这几个库之后,接下来我们就要来一个大的,构建OpenSceneGraph这样大型库。OpenSceneGraph(简称 OSG)是一个高性能、跨平台的三维图形应用程序框架,广泛应用于科学可视化、模拟仿真、游戏开发等领域。理论上来说,上述几个库不是OSG的必须依赖库,但是将它们作为依赖库构建,OSG的功能就更完整。
2. 构建过程
构建OSG库的关键指令如下所示:
# 配置CMake
cmake .. -G "$Generator" -A x64 `
-DCMAKE_BUILD_TYPE=RelWithDebInfo `
-DCMAKE_PREFIX_PATH="$InstallDir" `
-DCMAKE_INSTALL_PREFIX="$InstallDir" `
-DGIFLIB_LIBRARY="$InstallDir/lib/giflib.lib" `
-DBUILD_OSG_APPLICATIONS=ON `
-DBUILD_OSG_EXAMPLES=OFF `
-DBUILD_OSG_DEPRECATED_SERIALIZERS=OFF `
-DCMAKE_RELWITHDEBINFO_POSTFIX=""
# 构建阶段,指定构建类型
cmake --build . --config RelWithDebInfo -- /m:8
# 安装阶段,指定构建类型和安装目标
cmake --build . --config RelWithDebInfo --target install
再次强调一遍,如果要优先找到提前编译好的依赖库,就需要设置CMAKE_PREFIX_PATH变量。我们把所有的库都安装到同一个目录中并设置成CMAKE_PREFIX_PATH变量,这样在构建新的依赖库的时候,CMake就能准确查找到相关的依赖库。不过,也会出现少数查找不到的情况,这里的GIFLIB就没有查找到,因此我们手动设置GIFLIB_LIBRARY。
其余的几个OSG提供的自定义构建选项中:
- BUILD_OSG_APPLICATIONS表示是否构建基于OSG的可执行程序,例如osgviewer、osgconv等。这样的应用工具还是非常实用的,推荐还是进行构建。
- BUILD_OSG_EXAMPLES表示是否构建示例程序,像这样的构建选项,为了加快构建速度一般不用进行构建。
- BUILD_OSG_DEPRECATED_SERIALIZERS看到这个DEPRECATED字眼就不用参与进行构建了,反正也是非必须项。
- CMAKE_RELWITHDEBINFO_POSTFIX表示是否给RelWithDebInfo方式编译的结果增加后缀,默认会增加后缀“rd”,这里将其设置为空。
3. 经验总结
构建像OSG这样的大型程序库,最好多看看CMake配置完成后的输出信息,例如这里的输出信息如下所示:
CMake Deprecation Warning at CMakeLists.txt:16 (CMAKE_MINIMUM_REQUIRED):
Compatibility with CMake < 2.8.12 will be removed from a future version of
CMake.
Update the VERSION argument <min> value or use a ...<max> suffix to tell
CMake that the project does not need compatibility with older versions.
-- Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22631.
-- Could NOT find EGL (missing: EGL_LIBRARY EGL_INCLUDE_DIR)
-- Checking windows version...
-- 64 bit architecture detected
-- Could NOT find Jasper (missing: JASPER_LIBRARIES JASPER_INCLUDE_DIR)
-- Could NOT find LibXml2 (missing: LIBXML2_INCLUDE_DIR)
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
The package name passed to `find_package_handle_standard_args` (PkgConfig)
does not match the name of the calling package (GTA). This can lead to
problems in calling code that expects `find_package` result variables
(e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.26/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
CMakeModules/FindGTA.cmake:11 (INCLUDE)
CMakeLists.txt:751 (FIND_PACKAGE)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
The package name passed to `find_package_handle_standard_args` (PkgConfig)
does not match the name of the calling package (GTA). This can lead to
problems in calling code that expects `find_package` result variables
(e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.26/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
CMakeModules/FindGTA.cmake:15 (INCLUDE)
CMakeLists.txt:751 (FIND_PACKAGE)
This warning is for project developers. Use -Wno-dev to suppress it.
-- Checking for module 'gta'
-- No package 'gta' found
-- Trying to find DCMTK expecting DCMTKConfig.cmake
-- Trying to find DCMTK expecting DCMTKConfig.cmake - failed
-- Trying to find DCMTK relying on FindDCMTK.cmake
-- Please set DCMTK_DIR and re-run configure (missing: DCMTK_config_INCLUDE_DIR DCMTK_dcmdata_INCLUDE_DIR DCMTK_dcmimage_INCLUDE_DIR DCMTK_dcmimgle_INCLUDE_DIR DCMTK_dcmjpeg_INCLUDE_DIR DCMTK_dcmjpls_INCLUDE_DIR DCMTK_dcmnet_INCLUDE_DIR DCMTK_dcmpstat_INCLUDE_DIR DCMTK_dcmqrdb_INCLUDE_DIR DCMTK_dcmsign_INCLUDE_DIR DCMTK_dcmsr_INCLUDE_DIR DCMTK_dcmtls_INCLUDE_DIR DCMTK_ofstd_INCLUDE_DIR DCMTK_oflog_INCLUDE_DIR)
-- Could NOT find GStreamer (missing: GSTREAMER_INCLUDE_DIRS GSTREAMER_LIBRARIES GSTREAMER_VERSION GSTREAMER_BASE_INCLUDE_DIRS GSTREAMER_BASE_LIBRARIES GSTREAMER_APP_INCLUDE_DIRS GSTREAMER_APP_LIBRARIES GSTREAMER_PBUTILS_INCLUDE_DIRS GSTREAMER_PBUTILS_LIBRARIES)
-- Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR)
-- Could NOT find SDL (missing: SDL_LIBRARY SDL_INCLUDE_DIR)
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
The package name passed to `find_package_handle_standard_args` (PkgConfig)
does not match the name of the calling package (Poppler-glib). This can
lead to problems in calling code that expects `find_package` result
variables (e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.26/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
CMakeModules/FindPoppler-glib.cmake:2 (INCLUDE)
CMakeLists.txt:761 (FIND_PACKAGE)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
The package name passed to `find_package_handle_standard_args` (PkgConfig)
does not match the name of the calling package (Poppler-glib). This can
lead to problems in calling code that expects `find_package` result
variables (e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.26/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
CMakeModules/FindPoppler-glib.cmake:6 (INCLUDE)
CMakeLists.txt:761 (FIND_PACKAGE)
This warning is for project developers. Use -Wno-dev to suppress it.
-- Checking for module 'cairo'
-- No package 'cairo' found
-- Checking for module 'poppler-glib'
-- No package 'poppler-glib' found
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
The package name passed to `find_package_handle_standard_args` (PkgConfig)
does not match the name of the calling package (RSVG). This can lead to
problems in calling code that expects `find_package` result variables
(e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.26/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
CMakeModules/FindRSVG.cmake:2 (INCLUDE)
CMakeLists.txt:762 (FIND_PACKAGE)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
The package name passed to `find_package_handle_standard_args` (PkgConfig)
does not match the name of the calling package (RSVG). This can lead to
problems in calling code that expects `find_package` result variables
(e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.26/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
CMakeModules/FindRSVG.cmake:6 (INCLUDE)
CMakeLists.txt:762 (FIND_PACKAGE)
This warning is for project developers. Use -Wno-dev to suppress it.
-- Checking for module 'librsvg-2.0>=2.35'
-- No package 'librsvg-2.0' found
-- Checking for module 'cairo'
-- No package 'cairo' found
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
The package name passed to `find_package_handle_standard_args` (PkgConfig)
does not match the name of the calling package (GtkGl). This can lead to
problems in calling code that expects `find_package` result variables
(e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.26/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
CMakeModules/FindGtkGl.cmake:2 (INCLUDE)
CMakeLists.txt:763 (FIND_PACKAGE)
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
The package name passed to `find_package_handle_standard_args` (PkgConfig)
does not match the name of the calling package (GtkGl). This can lead to
problems in calling code that expects `find_package` result variables
(e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.26/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
CMakeModules/FindGtkGl.cmake:6 (INCLUDE)
CMakeLists.txt:763 (FIND_PACKAGE)
This warning is for project developers. Use -Wno-dev to suppress it.
-- Checking for module 'gtk+-2.0'
-- No package 'gtk+-2.0' found
-- Checking for module 'gtkglext-win32-1.0'
-- No package 'gtkglext-win32-1.0' found
-- Could NOT find Fontconfig (missing: FONTCONFIG_LIBRARY FONTCONFIG_INCLUDE_DIR)
-- osgText will not be linked with FontConfig library
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.26/Modules/Documentation.cmake:30 (message):
Policy CMP0106 is not set: The Documentation module is removed. Run "cmake
--help-policy CMP0106" for policy details. Use the cmake_policy command to
set the policy and suppress this warning.
Documentation.cmake is VTK-specific code and should not be used in non-VTK
projects. This logic in this module is best shipped with the project using
it rather than with CMake.
Call Stack (most recent call first):
CMakeLists.txt:1162 (INCLUDE)
This warning is for project developers. Use -Wno-dev to suppress it.
-- The following OPTIONAL packages have been found:
* OpenGL
* Freetype
* FBX
* GDAL
* CURL
* GIFLIB
* JPEG
* ZLIB
* PNG
* TIFF
* Threads
-- The following OPTIONAL packages have not been found:
* EGL
* ilmbase
* Inventor
* Jasper
* OpenEXR
* OpenCascade
* LibXml2
* COLLADA
* GTA
* LibVNCServer
* DCMTK
* FFmpeg
* GStreamer
* GLIB
* DirectShow
* SDL2
* SDL
* Poppler-glib
* RSVG
* RSVG
* GtkGl
* DirectInput
* GtkGl
* DirectInput
* NVTT
* NVTT
* ZeroConf
* LIBLAS
* ZeroConf
* LIBLAS
* QuickTime
* LIBLAS
* QuickTime
* QuickTime
* Fontconfig
-- Configuring done (3.5s)
-- Generating done (15.6s)
-- Build files have been written to: C:/Github/BuildCppDependency/Windows/OpenSceneGraph-OpenSceneGraph-3.6.5/build
看起来非常的繁杂,但是其实没什么内容,只要是在说有的依赖库找不到,有的依赖库找到了。最后还把找到的依赖库和没找到的依赖库都列出来了。关于这一点,我们只需要重点关心我们需要的依赖库是否识别成功了即可,以为有的大型库的依赖项非常多,不太可能一次性就把完整的依赖项准备好。
除此之外,还可以看看程序库提供的自定义构建选项,暂时用不到的暂时设为OFF不进行构建了,例如一些测试程序或者案例程序。CMake提供的功能非常强大,有的功能还会远程拉取代码,这个时候往往会因为国内网速的原因导致终端构建配置。不过,提供这种功能的模块往往是非必须的构建选项,可以找一找将其取消掉,在重新进行构建。
总之,多看看的构建配置的输出信息和选项,熟能生巧,有了经验以后就能又快又好地构建依赖库了。
CMake构建学习笔记8-OpenSceneGraph库的构建的更多相关文章
- 【学习笔记】开源库之 - sigslot (在解决浅拷贝问题的基础上增加信号拦截功能)
前言说明 在文中<[学习笔记]开源库之 - sigslot (提供该库存在对象拷贝崩溃问题的解决方案)>已经介绍过 sigslot ,此文主要应用在实际的工作项目中时,发现会有拦截信号的需 ...
- iOS学习笔记16-数据库SQLite
一.数据库 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等.离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式: 归档:NSKeyedArchiver 偏好设置:NSU ...
- SpringCloud学习笔记(6):使用Zuul构建服务网关
简介 Zuul是Netflix提供的一个开源的API网关服务器,SpringCloud对Zuul进行了整合和增强.服务网关Zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可 ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- CMake学习笔记五-依赖库添加
# # 项目名称 # SET(WIS_PROJECT_NAME EXAMPLE) # dependencies SET(DEPENDENCIES #依赖第三方库 ) #Qt模块 SET(QT_MODU ...
- 《Spring实战》学习笔记-第五章:构建Spring web应用
之前一直在看<Spring实战>第三版,看到第五章时发现很多东西已经过时被废弃了,于是现在开始读<Spring实战>第四版了,章节安排与之前不同了,里面应用的应该是最新的技术. ...
- [No000094]SVN学习笔记4-版本库概念与部分日常操作
基本概念 版本库 Subversion 使用集中的数据库,它包含了所有的版本控制文件及其完整历史.这个数据库就是版本库.版本库通常位于运行 Subversion 服务器的文件服务器上,向 Subver ...
- 重温JSP学习笔记--JSTL标签库
以前写jsp的时候对jstl标签库是有些抵触的,因为我觉得嵌入java代码的方式几乎无往不利,没有必要使用标签库,不过这次复习还是好好地学习了一下,发现这个还是很有用处的,用得好能省不少事,JSTL是 ...
- OpenGL学习笔记0——安装库
最近需要做一个基于Zigbee室内无线定位的系统,受到TI公司ZigBee Sensor Monitor软件的启发,打算用OpenGL来做一个3D显示空间内物体位置的程序.学习阶段选择VS2010+O ...
- 学习笔记_Java_day13_JSTL标签库(1、2、3、4、5、6、7、8)
1.一种标签语言 day13 l JSTL标签库(重点) l 自定义标签(理解) l MVC设计模式(重点中的重点) l Java三层框架(重点中的重点) JSTL标签库 1 什么是JSTL ...
随机推荐
- 下载 Linux 内核的脚本
介绍 在 类UNIX 环境下运行比较好(基于wget) 包括了 2.6 ~ 4.x 内核的地址. 5.x 因为 还在更新因此不做记录. 脚本下载地址: https://files.cnblogs.co ...
- 【资料分享】Xilinx XCZU7EV工业核心板规格书(四核ARM Cortex-A53 + 双核ARM Cortex-R5 + FPGA,主频1.5GHz)
1 核心板简介 创龙科技SOM-TLZU是一款基于Xilinx UltraScale+ MPSoC系列XCZU7EV高性能处理器设计的高端异构多核SoC工业核心板,处理器集成PS端(四核ARM Cor ...
- 配置hive环境步骤(zookeeper高可用集群已搭建)
安装mysql:1. 检查当前环境是否安装mysql服务(命令:rpm -qa | grep -i mysql)2. 卸载自带的mysql3. 卸载软件:rpm -e --nodeps mysql-l ...
- Windows安装OnlyOfiice教程
1.OnlyOffice介绍 OnlyOffice 是一个在线创建.编辑和协作文档的服务. 2.Docker介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移 ...
- Mysql通过frm和ibd恢复数据库
昨天的考试过程中,有个考点的服务器蓝屏重启后发现Mysql启动不了(5.6.45 x32版本,使用innoDB),重装后无法加载原数据库记录,通过查询资料,通过frm和idb文件成功恢复了数据库记录. ...
- vue2.x版本升级2.7版本
2022年7月1日,vue正式迎来2.7版本,代号:"Naruto".支持 Composition API + <script setup> .原文链接 也就是说,你可 ...
- Vue bug from backend
一个后端引发前端的BUG 使用的框架是vue 代码里面有一个组件 <table :data="data"/> 获取后台数据 this.data = await fetc ...
- tp5 为什么使用单例模式
首先我们要知道明确单例模式这个概念,那么什么是单例模式呢?单例模式顾名思义,就是只有一个实例.作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例, 这个类我们 ...
- 2024 暑假友谊赛-热身1(7.11)zhaosang
A-A https://vjudge.net/contest/639453#problem/A 为了解决这个问题,我们需要确定将墙上的所有数字转换为数字1的最小成本.将数字i转换成数字j的代价由矩阵c ...
- adb对安卓app进行抓包(ip连接设备)
adb对安卓app进行抓包(ip连接设备) 一,首先将安卓设备的开发者模式打开,提示允许adb调试 二,自己的笔记本要和安卓设备在同一个网段下(同连一个WiFi就可以了) 三,在笔记本上根据ip来连接 ...