CMake构建学习笔记8-OpenSceneGraph库的构建

embedded/2024/9/23 9:24:18/

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提供的自定义构建选项中:

  1. BUILD_OSG_APPLICATIONS表示是否构建基于OSG的可执行程序,例如osgviewer、osgconv等。这样的应用工具还是非常实用的,推荐还是进行构建
  2. BUILD_OSG_EXAMPLES表示是否构建示例程序,像这样的构建选项,为了加快构建速度一般不用进行构建
  3. BUILD_OSG_DEPRECATED_SERIALIZERS看到这个DEPRECATED字眼就不用参与进行构建了,反正也是非必须项。
  4. 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 ofCMake.Update the VERSION argument <min> value or use a ...<max> suffix to tellCMake 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 toproblems 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 toproblems 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 canlead to problems in calling code that expects `find_package` resultvariables (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 canlead to problems in calling code that expects `find_package` resultvariables (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 toproblems 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 toproblems 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 toproblems 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 toproblems 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 toset the policy and suppress this warning.Documentation.cmake is VTK-specific code and should not be used in non-VTKprojects.  This logic in this module is best shipped with the project usingit 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提供的功能非常强大,有的功能还会远程拉取代码,这个时候往往会因为国内网速的原因导致终端构建配置。不过,提供这种功能的模块往往是非必须的构建选项,可以找一找将其取消掉,在重新进行构建

总之,多看看的构建配置的输出信息和选项,熟能生巧,有了经验以后就能又快又好地构建依赖库了。


http://www.ppmy.cn/embedded/102311.html

相关文章

『 C++ 』线程库

文章目录 线程库线程的创建与销毁成员函数this_thread 命名空间线程的引用传值 互斥锁互斥锁的基本操作递归锁(可重入锁)定时互斥锁互斥锁管理器与互斥锁抛异常所引发的死锁问题 条件变量条件变量的等待条件变量的唤醒两个线程交替打印奇偶数 线程库 C标准库提供了一套完整的线…

JDK17 隐藏类 Hidden Classes 介绍

在JDK 17中&#xff0c;引入了一个新特性称为隐藏类&#xff08;Hidden Classes&#xff09;。这是一个旨在提高JVM性能和减少内存占用的特性&#xff0c;尤其是在处理大量的Lambda表达式时。隐藏类主要用于解决Lambda表达式的性能问题&#xff0c;并且它们在JDK 17及更高版本中…

【XML详解】

XML基本概念 XML&#xff08;全称EXtensible Markup Language&#xff0c;可扩展标记语言&#xff09;&#xff1a;是一种用于存储和传输数据的标记语言&#xff0c;通过标签&#xff08;tags&#xff09;来定义数据的结构和含义。数据格式&#xff1a;XML本质上是一种数据的格…

Linux 软件编程 数据库

1. 大批量数据存储和管理时使用数据库 2.创建表 create table 表名称(列1 数据类型, 列2 数据类型, ...); 3.插入表 insert into 表名称 values(值1, 值2, ...); 4.查看表 select 列1,列2,... from 表名称 where 匹配条件 order by 列名称 asc/desc; 5.删除表 delete from …

kubectl陈述式资源管理

目录 概念 kubectl的基础命令 *每天常用的查看集群的基本信息 deployment的部署方式 deployment 的特点 基于deployment创建pod 手动缩容 service的类型以及工作原理 创建service service的类型 修改service的类型为nodeport **nodeport实验&#xff1a;对外暴露端…

Windows Edge 兼容性问题修复

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Windows Edge 浏览器自2015年发布以来&#xff0c;经历了多次更新与优化&#xff0c;尤其在2020年基于 Chromium 引擎的新版 Edge浏览器发布后&#xff0c;其功能和兼容性大幅提升。然而&#xff0c;尽管如此…

FFmpeg的入门实践系列四(AVS)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力 文章目录 前期博客参考书籍一、AVS简介二、基于FFmpeg配置AVS2 前期博客 FFmpeg的入门实践系列一(环境搭建) FFmpeg的入门实践系列…

美国高防服务器测评

美国高防服务器通常具有出色的硬件配置和网络性能&#xff0c;以及强大的DDoS防御能力。rak小编为您整理发布美国高防服务器测评。 美国高防服务器因其地理位置和网络基础设施的优势&#xff0c;通常被认为在防御分布式拒绝服务(DDoS)攻击方面具有较高的能力。面对日益增长的网…