【Qt】【CMake】【CMakeLists.txt】-PROJECT_NAME 和 CMAKE_PROJECT_NAME 的区别

【Qt】【CMake】【CMakeLists.txt】-PROJECT_NAME 和 CMAKE_PROJECT_NAME 的区别

原帖:https://stackoverflow.com/questions/38938315/difference-between-cmake-project-name-and-project-name#:~:text=The%20difference%20is%20that%20CMAKE_PROJECT_NAME%20is%20the%20name,The%20difference%20is%20recognizable%20from%20the%20following%20test.

【CMake】【CMakeLists.txt】-PROJECT_NAME 和 CMAKE_PROJECT_NAME 的区别

两个项目名称宏的不同之处,在于:

1.CMAKE_PROJECT_NAME

是“根项目名称”,

是指最近一个命令指定的项目名称开始。

【译者goodmao注释】:

  例如:下面的例子中,

    project(B) #指定项目名字。

    add_subdirectory(test2) #给根项目B,添加子项目test2。

    那么,test2所在的“根项目”,就是B项目;

    所以,根项目B的子项目test2中的 CMakeLists.txt 中:

    CMAKE_PROJECT_NAME,指的是根项目 B;

    PROJECT_NAME,指的是子项目test2本身。    

2.PROJECT_NAME

是来自上一个项目调用,

无论包含该命令的文件的位置在哪儿。

The difference is that

       CMAKE_PROJECT_NAME is the name

       from the last project call from the root CMakeLists.txt,

while PROJECT_NAME is from the last project call,

          regardless from the location of the file containing the command.

从以下的测试代码中,我们可以看出两个名称的差异之处。

The difference is recognizable from the following test.

1.文件目录结构如下:

File structure:

|-CMakeLists.txt
\-test2
  |-CMakeLists.txt
  \-test3
    \-CMakeLists.txt

2.根项目的CMake编译脚本:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project(A)
message("< ${CMAKE_PROJECT_NAME} / ${PROJECT_NAME}")
project(B)
message("< ${CMAKE_PROJECT_NAME} / ${PROJECT_NAME}")
add_subdirectory(test2)
message("< ${CMAKE_PROJECT_NAME} / ${PROJECT_NAME}")
project(C)
message("< ${CMAKE_PROJECT_NAME} / ${PROJECT_NAME}")

3.子项目test2的CMake编译脚本:

test2/CMakeLists.txt:

project(D)
message("<< ${CMAKE_PROJECT_NAME} / ${PROJECT_NAME}")
add_subdirectory(test3)
project(E)
message("<< ${CMAKE_PROJECT_NAME} / ${PROJECT_NAME}")

4.孙子项目test3的CMake编译脚本:

test2/test3/CMakeLists.txt:

project(F)
message("<<< ${CMAKE_PROJECT_NAME} / ${PROJECT_NAME}")

5.相关的输出结果:

The relevant output is:

< A / A
< B / B
<< B / D
<<< B / F
<< B / E
< B / B
< C / C

【注意】:

在所有的子项目test2和孙子项目test3中,根项目名称(CMAKE_PROJECT_NAME),都是B。

In the sub-directories, always B is the value for CMAKE_PROJECT_NAME.

= = = 

<think>好的,用户遇到了另一个CMake错误,这次是关于找不到Qt5LinguistTools的配置。我需要先理解这个错误的原因。Qt5LinguistTools是Qt5的一部分,主要用于国际化支持,比如处理翻译文件。CMake在构建项目时,需要找到对应的模块,但用户系统里可能没有安装相应的开发包或者CMake路径配置不对。 首先,我应该确认用户是否安装了正确的Qt开发包。不同的Linux发行版包名称可能不同,比如Ubuntu可能需要qttools5-dev,而Fedora则是qt5-linguist。用户之前处理过gio-2.0的问题,可能对包管理有一定了解,但可能还不熟悉Qt相关的依赖。 然后,考虑用户可能已经安装了Qt,但路径没有正确设置。这时候需要检查CMAKE_PREFIX_PATH是否指向Qt的安装目录,或者是否通过环境变量让CMake找到Qt。如果用户自己编译安装了Qt,可能需要手动设置路径。 另外,用户可能使用的是较旧的CMake版本,导致对Qt5的支持不够好,建议升级CMake。或者项目中的CMakeLists.txt可能需要显式地包含find_package(Qt5 COMPONENTS LinguistTools REQUIRED),而用户没有正确配置组件。 还需要考虑多架构的问题,比如用户是否在aarch64架构下,某些包可能需要特定的版本或路径。这时候可能需要安装对应的多架构支持包,或者检查库文件的位置。 最后,提供一些调试方法,比如手动查找Qt5LinguistToolsConfig.cmake文件是否存在,或者运行CMake时加上--debug-find参数来查看详细查找过程。这能帮助用户更准确地定位问题。 总结下来,解决方案应该包括安装正确的开发包、设置CMake路径、检查Qt安装情况、升级CMake,以及提供调试步骤。同时,要给出不同发行版的安装命令,确保用户能根据自身系统进行操作。如果用户按照步骤操作后仍然有问题,可能需要进一步检查Qt的安装路径或项目配置是否有误。</think>--- 这个错误表明 CMake 在编译过程中无法定位 **Qt5 Linguist Tools 模块**,这是 Qt5 国际化支持的关键组件(用于处理 `.ts` 翻译文件)。以下是系统性解决方案: --- ### 错误根源 1. **未安装 Qt5 Linguist Tools 开发包** 系统中缺少 `Qt5LinguistTools` 的 CMake 配置文件(如 `Qt5LinguistToolsConfig.cmake`) 2. **Qt 安装路径未被 CMake 识别** 若通过非标准路径安装 Qt(如源码编译),需手动指定路径 --- ### 分步解决方案 #### 步骤 1:安装 Qt5 Linguist Tools 根据 Linux 发行版选择对应命令: - **Ubuntu/Debian** ```bash sudo apt-get install qttools5-dev # 包含 Qt5LinguistTools ``` - **Fedora/CentOS** ```bash sudo dnf install qt5-linguist ``` - **Arch/Manjaro** ```bash sudo pacman -S qt5-tools ``` #### 步骤 2:验证安装结果 检查关键文件是否存在: ```bash # 确认 CMake 配置文件存在 ls /usr/lib/cmake/Qt5LinguistTools/Qt5LinguistToolsConfig.cmake # 检查二进制工具 ls /usr/lib/qt5/bin/lrelease ``` #### 步骤 3:配置 CMake 路径 如果已安装但 CMake 仍报错,需显式指定 Qt 路径: **方法 1:通过环境变量** 在编译命令中设置 Qt 安装路径: ```bash cmake -B build -DCMAKE_PREFIX_PATH="/usr/lib/x86_64-linux-gnu/cmake/Qt5" ``` **方法 2:修改 `CMakeLists.txt`** 在项目根 CMakeLists.txt 中添加: ```cmake set(CMAKE_PREFIX_PATH "/usr/lib/x86_64-linux-gnu/cmake/Qt5;${CMAKE_PREFIX_PATH}") ``` #### 步骤 4:强制重定位 Qt 模块 如果使用自定义 Qt 安装路径(例如通过源码编译): ```bash export QT_DIR=/opt/Qt5.15.2/5.15.2/gcc_64/lib/cmake cmake -B build -DCMAKE_PREFIX_PATH=$QT_DIR ``` --- ### 深度调试技巧 1. **手动查找 CMake 配置文件** 全局搜索关键文件: ```bash sudo find / -name "Qt5LinguistToolsConfig.cmake" 2>/dev/null ``` - 典型路径: `/usr/lib/x86_64-linux-gnu/cmake/Qt5LinguistTools` 2. **检查 Qt 版本兼容性** ```bash qmake --version # 需要 ≥ Qt 5.9 ``` 3. **启用 CMake 调试模式** 查看详细的查找过程: ```bash cmake -B build --debug-find 2>&1 | grep "Looking for Qt5LinguistTools" ``` --- ### 典型错误场景排查表 | 现象 | 解决方案 | |--------------------------|-----------------------------| | 已安装但提示找不到模块 | 设置 `-DCMAKE_PREFIX_PATH=/usr/lib/$ARCH/cmake/Qt5` | | 多版本 Qt 冲突 | 用 `qtchooser` 切换默认版本:`export QT_SELECT=qt5` | | 项目需要特定 Qt 版本 | 通过 `apt install qt5-default` 设置系统默认版本 | --- ### 验证成功的关键输出 CMake 应显示: ```text -- Found Qt5LinguistTools: /usr/lib/x86_64-linux-gnu/cmake/Qt5LinguistTools (found version "5.15.2") ``` --- ### 扩展建议 1. **完整 Qt5 开发环境安装** 如果项目依赖其他 Qt 模块: ```bash sudo apt-get install qtbase5-dev qtdeclarative5-dev qtmultimedia5-dev # Ubuntu ``` 2. **源码编译 Qt 的注意事项** 若从源码编译 Qt,需确保配置时启用 linguist: ```bash ./configure -prefix /opt/Qt5.15.2 -linguist ``` 3. **交叉编译环境配置** 在 aarch64 架构下可能需要多架构支持: ```bash sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu cmake -B build -DCMAKE_TOOLCHAIN_FILE=../toolchain-aarch64.cmake ``` --- ### 附:Qt5 关键组件对照表 | 组件名 | 功能 | Debian 包名 | |-----------------------|--------------------------|---------------------| | Qt5Core | 核心模块 | qtbase5-dev | | Qt5LinguistTools | 翻译工具 | qttools5-dev | | Qt5Widgets | GUI 控件库 | qttools5-dev | | Qt5Multimedia | 多媒体支持 | qtmultimedia5-dev | 通过上述步骤,可系统化解决 Qt5LinguistTools 的定位问题。如果仍有异常,请提供完整 CMake 输出及 `ls /usr/lib/cmake/Qt5*` 的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值