使用 CMake 编译 QTCreator 和 VisualStudio 代码

Posted

技术标签:

【中文标题】使用 CMake 编译 QTCreator 和 VisualStudio 代码【英文标题】:QTCreator and VisualStudio Code compilation with CMake 【发布时间】:2020-05-26 21:31:20 【问题描述】:

我有一个关于程序编译的问题。我不知道为什么在 QTcreator 而不是在 Visual Studio 中编译相同的 CMakeLists.txt。我正在使用与 Windows 版 MinGW 完全相同的编译器。我已阅读文档,如果使用翻译文件untitled_fr_FR.ts,它编译得很好EXCEPT

请参阅 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

#---------------------------------------------------------------------    
# I ADD THIS ONE TO COMPILE IN VSCODE AS ASKED IN THE DOCUMENTATION
#---------------------------------------------------------------------
set(CMAKE_PREFIX_PATH $CMAKE_PREFIX_PATH "C:\\Qt\\5.15.0\\mingw81_64")
#---------------------------------------------------------------------

project(untitled LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Widgets LinguistTools REQUIRED)

set(TS_FILES untitled_fr_FR.ts)

  add_executable(untitled
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
    $TS_FILES
  )

target_link_libraries(untitled PRIVATE Qt5::Widgets)

qt5_create_translation(QM_FILES $CMAKE_SOURCE_DIR $TS_FILES)

此代码在 QTCreator 中运行良好,但在 VSCode 中出现此错误:

[main] Building folder: untitled 
[build] Starting build
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --build c:/Users/remi/Desktop/ok/untitled/build --config Debug --target all -- -j 6
[build] [ 16%] Automatic MOC and UIC for target untitled
[build] [ 16%] Built target untitled_autogen
[build] mingw32-make.exe[2]: *** No rule to make target '../', needed by '../untitled_fr_FR.ts'.  Stop.
[build] mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:95: CMakeFiles/untitled.dir/all] Error 2
[build] mingw32-make.exe: *** [Makefile:103: all] Error 2
[build] Build finished with exit code 2

***** No rule to make target '../', needed by '../untitled_fr_FR.ts'.  Stop.**

我该如何解决这个问题?如何确定 QTCreator 在 CMake 文件/env 中发生了什么变化以编译 .ts 文件?

非常感谢您的帮助,希望我清楚,我不会打扰您。

【问题讨论】:

也许,尝试从命令中删除$CMAKE_SOURCE_DIRqt5_create_translation(QM_FILES $CMAKE_SOURCE_DIR $TS_FILES)。包含此 $CMAKE_SOURCE_DIR 参数将处理 CMAKE_SOURCE_DIR 中的源,但您似乎已经从该目录中显式添加了 TS_FILES 源,因此拥有两个参数是多余的...... @squareskittles 感谢您的回答。它工作得更好,但仍然失败 [build] [33%] 生成 ../untitled_fr_FR.ts [build] lupdate 错误:列表文件''不可读。 [build] mingw32-make.exe[2]: *** [CMakeFiles\untitled.dir\build.make:81: ../untitled_fr_FR.ts] 错误 1 抱歉,我之前的评论可能有点误导。这个command 的文档有点不清楚。似乎它可能需要列出的 .ts 文件具有相应的同名 source 文件。因此,您的 untitled_fr_FR.ts 文件可能需要相应的 untitled_fr_FR.cpp 文件。您可以尝试重命名您的 .ts 文件以匹配您的 .cpp 文件之一。 谢谢...在将 untitled_fr_FR.ts 重命名为 mainwindow.ts 并将 set(TS_FILES untitled_fr_FR.ts) 更改为 set(TS_FILES mainwindow.ts) 后,它可以工作。但我不明白为什么: - 我不需要在 QTCreator 中这样做 - 如果我有多个窗口,它是如何工作的?我是***的新手,我现在不知道该怎么办,我需要回答我自己的问题吗? 是的,不幸的是我看到的documentation并不清楚,也不清楚为什么QTCreator不需要更改。文档建议参数可以是 ts 文件或源,因此对于多个文件,您可以执行 qt5_create_translation(QM_FILES mainwindow.cpp mainwindow.ts otherwindow.cpp otherwindow.ts ... ) 之类的操作。我现在没有办法测试它。但是,是的,回答您自己的问题以记录有效的方法会很有帮助,这将有助于未来的访问者访问您的问题。 【参考方案1】:

包含翻译的最佳方法是不使用此方法。编译程序的 CMakeLists.txt 是:

cmake_minimum_required(VERSION 3.5)

#---------------------------------------------------------------------    
# I ADD THIS ONE TO COMPILE IN VSCODE AS ASKED IN THE DOCUMENTATION
#---------------------------------------------------------------------
set(CMAKE_PREFIX_PATH $CMAKE_PREFIX_PATH "C:\\Qt\\5.15.0\\mingw81_64")
#---------------------------------------------------------------------

project(untitled LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Widgets REQUIRED)

  add_executable(untitled
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
  )

target_link_libraries(untitled PRIVATE Qt5::Widgets)

如果你想编译它(在 Qt 环境之外你需要使用这个:

cmake_minimum_required(VERSION 3.5)

#---------------------------------------------------------------------    
# I ADD THIS ONE TO COMPILE IN VSCODE AS ASKED IN THE DOCUMENTATION
#---------------------------------------------------------------------
set(CMAKE_PREFIX_PATH $CMAKE_PREFIX_PATH "C:\\Qt\\5.15.0\\mingw81_64")
#---------------------------------------------------------------------

project(untitled LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Widgets LinguistTools REQUIRED)

set(TS_FILES mainwindow.ts)

  add_executable(untitled
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
    $TS_FILES
  )

target_link_libraries(untitled PRIVATE Qt5::Widgets)

qt5_create_translation(QM_FILES $TS_FILES)

并在 ma​​inwindow.ts

中重命名 untitled_fr_FR.ts

【讨论】:

以上是关于使用 CMake 编译 QTCreator 和 VisualStudio 代码的主要内容,如果未能解决你的问题,请参考以下文章

带有 CMake 的 QtCreator,在编辑器中错误地解析了 __cplusplus 值

如何使用 QtCreator 为 Android/iOS 构建基于 CMake 的项目

qtserialport 与 qtcreator-ros-plugin 中的 CMake?

CMAKE_CXX_COMPILER 未在 qtcreator 中设置

Qt之QMake编译转换为CMake编译

使用 QtCreator 设置 GDB