qt在创建项目时可以选择build system为cmake,qtcreator会自动帮用户创建CMakeLists.txt文件,并且写入一些简单的内容。
CMake官方已经对qt提供了一些支持,但是支持有限,所以qt官方自己也写了一些cmake模块文件,但是在使用过程中,qt的一些模块可能还需要手动添加。在使用qt语言家的功能时,就需要这种方式添加模块。
我在CMakeLists.txt文件中使用了以下两行代码用于将.ts文件转为.qm文件,但是在使用过程中,cmake报错。
file(GLOB TS_FILES "${PROJECT_SOURCE_DIR}/*.ts")
QT5_CREATE_TRANSLATION(QM_FILES
${PROJECT_SOURCE_DIR}
${TS_FILES}
OPTIONS -source-language zh_CN -noobsolete)
Starting to parse CMake project.
CMake Error at CMakeLists.txt:20 (QT5_CREATE_TRANSLATION):
Unknown CMake command "QT5_CREATE_TRANSLATION".
在google上搜索到有人也遇到了同样的问题,原因是需要下载qt5-tools组件,在major Linux中只需要执行pacman -S qt5-tools命令即可。但是我下载该组件之后依然会报同样的问题,我在/usr/lib/cmake/Qt5LinguistTools/Qt5LinguistToolsMacros.cmake文件中的确有找到该函数的定义:
function(QT5_CREATE_TRANSLATION _qm_files)
set(options)
set(oneValueArgs)
set(multiValueArgs OPTIONS)
cmake_parse_arguments(_LUPDATE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(_lupdate_files ${_LUPDATE_UNPARSED_ARGUMENTS})
set(_lupdate_options ${_LUPDATE_OPTIONS})
set(_my_sources)
set(_my_tsfiles)
foreach(_file ${_lupdate_files})
get_filename_component(_ext ${_file} EXT)
get_filename_component(_abs_FILE ${_file} ABSOLUTE)
if(_ext MATCHES "ts")
list(APPEND _my_tsfiles ${_abs_FILE})
else()
list(APPEND _my_sources ${_abs_FILE})
endif()
endforeach()
foreach(_ts_file ${_my_tsfiles})
if(_my_sources)
# make a list file to call lupdate on, so we don't make our commands too
# long for some systems
get_filename_component(_ts_name ${_ts_file} NAME)
set(_ts_lst_file "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${_ts_name}_lst_file")
set(_lst_file_srcs)
foreach(_lst_file_src ${_my_sources})
set(_lst_file_srcs "${_lst_file_src}\n${_lst_file_srcs}")
endforeach()
get_directory_property(_inc_DIRS INCLUDE_DIRECTORIES)
foreach(_pro_include ${_inc_DIRS})
get_filename_component(_abs_include "${_pro_include}" ABSOLUTE)
set(_lst_file_srcs "-I${_pro_include}\n${_lst_file_srcs}")
endforeach()
file(WRITE ${_ts_lst_file} "${_lst_file_srcs}")
endif()
add_custom_command(OUTPUT ${_ts_file}
COMMAND ${Qt5_LUPDATE_EXECUTABLE}
ARGS ${_lupdate_options} "@${_ts_lst_file}" -ts ${_ts_file}
DEPENDS ${_my_sources}
BYPRODUCTS ${_ts_lst_file} VERBATIM)
endforeach()
qt5_add_translation(${_qm_files} ${_my_tsfiles})
set(${_qm_files} ${${_qm_files}} PARENT_SCOPE)
endfunction()
最后在一个github的开源项目中找到真正原因,原来 LinguistTools是一个单独的模块,qtcreator自动生成的引入模块语句只有下面一句:
find_package(Qt5 COMPONENTS Widgets REQUIRED)
这句话只能找到Qt5 的Widgets组件模块,其他cmake模块还需要手动添加。
所以只需要将上面的代码改为:
find_package(Qt5 COMPONENTS Widgets LinguistTools REQUIRED)
或者直接添加一句:
find_package(Qt5 COMPONENTS LinguistTools)
之后就可以正常将.ts编译为.qm了
官方文档:https://doc.qt.io/qt-5/cmake-manual.html