CMakeList.txt中执行命令
时间: 2025-06-14 16:08:05 浏览: 16
<think>我们已经在之前的对话中确认:将.ts文件转换为.qm文件应该使用`lrelease`工具。但是用户的问题描述中提到“使用lupdate命令将test.ts翻译文件生成test.qm文件”,这里存在一个误解,因为lupdate用于生成和更新ts文件,而lrelease用于生成qm文件。用户本次提问:在CMakeLists.txt中配置命令,用于将test.ts文件生成为test.qm文件。因此,我们需要在CMakeLists.txt中添加自定义命令来调用lrelease工具,将test.ts编译成test.qm。步骤:1.首先确保系统中已经安装了Qt,并且可以通过CMake找到Qt。2.在CMakeLists.txt中,使用`find_program`来定位lrelease工具的可执行文件。3.使用`add_custom_command`或`add_custom_target`来定义生成.qm文件的规则。假设我们有一个名为`test.ts`的翻译文件位于项目的`translations`目录下,我们希望生成的`test.qm`也放在该目录下(或者我们可以指定输出目录)。示例CMakeLists.txt片段:```cmake#查找lrelease工具find_program(LRELEASE_EXECUTABLENAMESlreleaselrelease.exePATHS${Qt5_DIR}/../../../binDOC"QtLinguistreleasetool")if(NOTLRELEASE_EXECUTABLE)message(FATAL_ERROR"lreleasenotfound!PleasesetthepathtoQt.")endif()#定义输入和输出文件set(TS_FILE${CMAKE_CURRENT_SOURCE_DIR}/translations/test.ts)set(QM_FILE${CMAKE_CURRENT_BINARY_DIR}/translations/test.qm)#通常二进制文件放在构建目录#确保输出目录存在file(MAKE_DIRECTORY${CMAKE_CURRENT_BINARY_DIR}/translations)#添加自定义命令add_custom_command(OUTPUT${QM_FILE}COMMAND${LRELEASE_EXECUTABLE}ARGS${TS_FILE}-qm${QM_FILE}DEPENDS${TS_FILE}COMMENT"Generating.qmfilefrom.ts:${TS_FILE}")#如果我们希望有一个目标来驱动这个命令(可选)add_custom_target(generate_qm_filesALLDEPENDS${QM_FILE})#如果要在其他地方使用这个生成的.qm文件(例如安装),可以继续添加其他命令。```注意:-如果项目中有多个.ts文件,我们可以使用循环来添加多个自定义命令。-由于`lrelease`每次运行时都会重新生成.qm文件,因此我们将其作为自定义命令,在每次构建时检查.ts文件是否更新。但是,用户可能会疑惑:为什么用`lrelease`而不是`lupdate`?因为用户的问题是“将test.ts生成test.qm”,所以用`lrelease`。另外,如果用户之前使用的是Qt的.pro文件,其中可能有类似:TRANSLATIONS+=translations/test.ts而在CMake中,我们并没有自动生成.ts的步骤(这个问题只要求生成.qm)。如果用户还需要从源代码生成.ts文件,则需要使用`lupdate`,但这是另一个问题。由于用户仅要求将.ts转换成.qm,所以这里只处理这一步骤。如果我们希望将生成.qm文件作为构建过程的一部分,那么上面的自定义命令和自定义目标就可以实现。在引用方面,我们参考了之前对话中关于lrelease和lupdate区别的说明[^1]。同时,我们可以生成相关问题,例如:1.如何在CMake中自动从源代码更新.ts翻译文件?2.如何在Qt项目中实现多语言动态切换?3.如何将生成的.qm文件嵌入到Qt资源系统中?现在,我们按照用户要求生成回答。</think>
### 🔧 在 CMakeLists.txt 中配置 `.ts` → `.qm` 转换
以下是在 CMakeLists.txt 中添加命令实现自动转换的完整方案:
#### 📝 核心配置 (CMakeLists.txt)
```cmake
# 1. 查找 Qt 的 lrelease 工具
find_program(LRELEASE_EXECUTABLE
NAMES lrelease lrelease.exe
PATHS "${Qt5_DIR}/../../../bin"
DOC "Qt Linguist 编译工具"
)
# 2. 定义转换命令
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/test.qm
COMMAND ${LRELEASE_EXECUTABLE}
ARGS ${CMAKE_CURRENT_SOURCE_DIR}/test.ts -qm ${CMAKE_CURRENT_BINARY_DIR}/test.qm
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/test.ts
COMMENT "编译翻译文件: test.ts → test.qm"
VERBATIM
)
# 3. 添加自定义目标(可选)
add_custom_target(generate_translations
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/test.qm
)
```
#### 🧩 关键配置说明:
1. **查找工具路径**
`find_program` 自动定位系统中安装的 `lrelease` 工具[^1]
- `Qt5_DIR`: 通常由 `find_package(Qt5 COMPONENTS Core)` 自动设置
- 支持跨平台 (Windows/macOS/Linux)
2. **依赖关系处理**
`DEPENDS` 确保当 `.ts` 文件修改时自动重新生成 `.qm`:
```mermaid
graph LR
A[修改 test.ts] --> B[触发构建]
B --> C[执行 lrelease]
C --> D[生成 test.qm]
```
3. **文件路径规范**
- 输入:源目录下的 `test.ts`
- 输出:构建目录下的 `test.qm`(保持构建隔离)
- 使用 `VERBATIM` 避免路径中的特殊字符问题[^3]
#### 🚀 使用场景
```cmake
# 在应用目标中声明依赖
add_executable(MyApp main.cpp)
add_dependencies(MyApp generate_translations)
# 安装翻译文件
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/test.qm
DESTINATION translations
)
```
#### 💡 高级技巧
**处理多个语言文件**:
```cmake
set(LANGS zh_CN en_GB ja_JP)
foreach(LANG ${LANGS})
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.qm
COMMAND ${LRELEASE_EXECUTABLE}
ARGS ${LANG}.ts -qm ${LANG}.qm
DEPENDS ${LANG}.ts
)
list(APPEND QM_FILES ${LANG}.qm)
endforeach()
add_custom_target(generate_translations DEPENDS ${QM_FILES})
```
**自动资源嵌入**:
```cmake
# 添加 .qm 文件到 Qt 资源系统
qt5_add_resources(QRC_FILES
translations.qrc
PREFIX /i18n
FILES ${QM_FILES}
)
```
> ⚠️ 注意:确保在项目中已调用 `find_package(Qt5 COMPONENTS LinguistTools)`[^1]
阅读全文
相关推荐


















