cmake/gcc:strip缩减程序体积

本文详细介绍了如何使用CMake的Makefile中的install/strip目标,自动执行strip命令以删除安装程序的符号表和重定位信息,同时提供了通过gcc的-s选项实现相同目的的方法。

方法1

cmake生成的Makefile中有一个target名为intall/strip可以将install的可执行程序执行strip,执行make help,就可以看到

$ make help
The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... install
... list_install_components
... install/strip
... install/local
... rebuild_cache
... edit_cache

所以执行make install/strip安装程序时就会自动执行strip
如果要深究细节,可以查看Makefile代码,install/strip 是这样写的

install/strip: preinstall
	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..."
	/opt/toolchains/mips-gcc520-glibc222/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
.PHONY : install/strip

上面的代码可以看出安装动作实际是由cmake_install.cmake来实现的,
上面install/strip执行cmake时调用的脚本 cmake_install.cmake中会根据CMAKE_INSTALL_DO_STRIP的值决定是否执行strip命令,如下是cmake_install.cmake脚本中的代码片段

  foreach(file
      "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/./app-1.3.1"
      "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/./app"
      )
    if(EXISTS "${file}" AND
       NOT IS_SYMLINK "${file}")
      if(CMAKE_INSTALL_DO_STRIP)
        execute_process(COMMAND "/opt/toolchains/mips-gcc520-glibc222/bin/mips-linux-gnu-strip" "${file}")
      endif()
    endif()

方法2

网上找到这个stackoverflow上的帖子《How to config cmake for strip file》,才知道gcc本身有一个-s连接选项(Link Option)用于删除执行程序的符号表和重定位信息。
在这里插入图片描述

参见gcc官方手册《3.14 Options for Linking》

在这里插入图片描述

<think>好的,我现在需要帮助用户解决在Ubuntu上编译CGAL-5.0.2时遇到的Qt5Gui配置错误,具体是找不到GL/gl.h的问题。首先,我需要回顾用户提供的信息和之前的对话,确保解决方案准确。 用户提到参考了四个引用内容,其中引用[1]是CGAL的安装步骤,引用[2]和[3]提到了编译时的CMake错误,引用[4]是文档链接。用户当前的问题是关于GL/gl.h缺失导致的Qt5Gui配置失败。 首先,我需要确定GL/gl.h在Ubuntu中的来源。通常,这个头文件属于OpenGL开发包,可能属于mesa-common-dev或libgl1-mesa-dev。用户可能没有安装这些包,导致编译时找不到头文件。 接下来,用户的问题涉及Qt5_DIR的设置是否正确,因为CGAL依赖Qt5的组件,尤其是Qt5Gui模块需要OpenGL支持。需要检查Qt5的安装路径是否正确,并确保CMake能够找到相关的配置文件,如Qt5Config.cmake和Qt5GuiConfig.cmake。 此外,用户可能同时安装了多个Qt版本,或者系统自带的Qt与手动安装的版本冲突,导致CMake优先找到了不带OpenGL支持的版本。因此,需要指导用户显式指定Qt5_DIR,并设置CMAKE_PREFIX_PATH以确保正确版本被使用。 另外,可能涉及到OpenGL的include路径是否正确传递给CMake。即使安装了开发包,有时CMake可能找不到路径,需要手动指定OPENGL_INCLUDE_DIR。 用户之前的问题中,助手已经给出了一些关于Qt5_DIR的查找方法和配置建议,但当前问题更具体于GL/gl.h的缺失,可能需要更具体的依赖安装和路径设置。 需要检查的步骤可能包括: 1. 安装必要的OpenGL开发包。 2. 确认Qt5安装正确,并且包含OpenGL支持。 3. 确保CMake配置时正确设置Qt5_DIR和OPENGL_INCLUDE_DIR。 4. 处理可能的符号链接问题,尤其是在Ubuntu中头文件的位置可能有所变化。 同时,用户可能在之前的尝试中遇到了路径配置错误或者依赖缺失,需要一步步排查。可能需要指导用户运行一些诊断命令,比如检查头文件是否存在,确认Qt5的安装路径,以及验证CMake的查找过程。 另外,考虑到用户是在Ubuntu上操作,可能需要使用sudo权限安装某些包,或者调整路径权限。需要注意用户是否有足够的权限执行安装和配置步骤。 最后,需要整合这些信息,给出一个清晰的步骤指南,帮助用户逐步解决问题,并验证每一步是否成功,以便用户能够定位问题所在。</think>根据引用内容[1][2][3]和实际编译环境,以下是解决Ubuntu上编译CGAL-5.0.2时Qt5Gui找不到GL/gl.h问题的完整方案: --- ### 一、核心依赖安装(解决90%基础问题) ```bash # 安装OpenGL开发文件(核心依赖) sudo apt install mesa-common-dev libgl1-mesa-dev # 安装Qt5完整开发套件(引用[1]的扩展需求) sudo apt install qtbase5-dev libqt5opengl5-dev # 验证GL头文件存在性(关键诊断) ls /usr/include/GL/gl.h # 应返回有效路径 ``` --- ### 二、Qt5_DIR精确配置 #### 1. 定位Qt5Config.cmake ```bash # 系统级安装路径(默认apt安装) /usr/lib/x86_64-linux-gnu/cmake/Qt5 # 手动编译安装路径(若存在) /home/user/Qt5.14.2/5.14.2/gcc_64/lib/cmake/Qt5 ``` #### 2. 显式指定Qt5_DIR(引用[3]的配置经验) ```bash cmake .. \ -DQt5_DIR=/usr/lib/x86_64-linux-gnu/cmake/Qt5 \ -DCGAL_Qt5_DIR=/usr/local/lib/cmake/CGAL_Qt5 \ -DOPENGL_INCLUDE_DIR=/usr/include/GL ``` --- ### 三、编译环境验证 #### 1. 检查Qt5Gui的OpenGL链接(引用[1]的编译要求) ```bash # 查看Qt5Gui的配置参数 cat /usr/lib/x86_64-linux-gnu/cmake/Qt5Gui/Qt5GuiConfig.cmake | grep "OPENGL" # 正确输出应包含: # _qt5gui_find_extra_libs(OPENGL "GL" "") ``` #### 2. 创建符号链接(针对旧版Ubuntu) ```bash # 修复非标准路径问题(引用[4]的兼容性处理) sudo ln -s /usr/include/x86_64-linux-gnu/GL /usr/include/GL ``` --- ### 四、CMake配置修正 #### 1. 强制指定OpenGL路径 ```cmake # 在CMakeLists.txt中添加 if(NOT OPENGL_INCLUDE_DIR) set(OPENGL_INCLUDE_DIR "/usr/include/GL") endif() ``` #### 2. 多版本控制(引用[2]的错误处理) ```bash # 清除旧配置干扰 rm -rf CMakeCache.txt CMakeFiles/ # 设置优先级路径 export CMAKE_PREFIX_PATH="/usr/local/qt5;/usr" ``` --- ### 五、分步验证流程 1. **基础环境验证**: ```bash # 确认OpenGL头文件存在 [ -f /usr/include/GL/gl.h ] && echo "OK" || echo "Missing" ``` 2. **Qt5模块检测**: ```bash cmake --find-package -DNAME=Qt5Gui -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=COMPILE ``` 3. **完整编译测试**: ```bash cd build cmake .. -DCMAKE_BUILD_TYPE=Release 2>&1 | grep -i "opengl" # 不应出现GL/gl.h相关错误 ``` --- ### 六、典型错误解决方案 | 错误现象 | 解决方案 | |---------|----------| | `fatal error: GL/gl.h: No such file or directory` | 执行`sudo apt install libgl1-mesa-dev` | | `Could NOT find Qt5Gui (missing: Qt5Gui_OPENGL_IMPLEMENTATION)` | 确认`-DQt5_DIR`指向正确路径 | | `Qt5 requires OpenGL but no valid GL/gl.h found` | 添加`-DOPENGL_INCLUDE_DIR=/usr/include/GL`参数 | --- ### 附:配置成功后文件结构验证 ```bash # Qt5关键文件检查 ls /usr/lib/x86_64-linux-gnu/cmake/Qt5Gui/Qt5GuiConfig.cmake ls /usr/include/GL/gl.h # CGAL_Qt5链接验证 ldd /usr/local/lib/libCGAL_Qt5.so | grep -E 'Qt5|GL' ``` 通过上述步骤,可系统化解决Ubuntu环境下因GL/gl.h缺失导致的Qt5Gui配置错误问题。若仍存在问题,建议检查`/usr/include`路径权限(需755)及gcc版本兼容性[^3]。 --- ### 相关问题 1. 如何在多版本Qt共存时指定CGAL使用的Qt版本? 2. 当系统同时存在X11和Wayland时如何确保OpenGL正确链接? 3. CGAL_Qt5模块对OpenGL的版本有哪些具体要求?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值