Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过CMake实现Qt项目_C++_Qt - Fatal编程技术网

C++ 通过CMake实现Qt项目

C++ 通过CMake实现Qt项目,c++,qt,C++,Qt,我正试图通过Cmake构建和运行非常简单和基本的Qt示例,删除.pro文件。 以下是Qt项目的代码(自动生成Qt项目的目录结构为 Cmake (my project name) ├── headers │   └── mainwindow.h ├── sources │   ├── main.cpp │   └── mainwindow.cpp └── forms └── mainwindow.ui 主窗口 #ifndef MAINWINDOW_H #define MAINWINDOW

我正试图通过Cmake构建和运行非常简单和基本的Qt示例,删除.pro文件。 以下是Qt项目的代码(自动生成Qt项目的目录结构为

Cmake (my project name)
├── headers
│   └── mainwindow.h
├── sources
│   ├── main.cpp
│   └── mainwindow.cpp
└── forms
    └── mainwindow.ui
主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
mainwindow.ui


主窗口
0
0
400
300
主窗口
0
0
400
29
顶部工具栏区域
假的

当我构建项目并运行Cmake时,它指向文件mainwindow.h,表示“ui\u mainwindow.h”没有这样的文件或目录。

您没有向我们显示CMakeLists.txt在目录结构中的位置。如果它是顶级的,那么您将

add_executable(Cmake sources/main.cpp sources/mainwindow.cpp)
你需要

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/headers)

无论如何,请找出生成ui.*.h文件的位置,并添加带有
include_directories

的目录。您的脚本有几个错误,还有一些可以改进的地方。更改后的情况如下:

cmake_minimum_required(VERSION 3.0.2)
project(MyProject)

find_package(Qt5Widgets)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

add_library(mainwindow mainwindow.cpp)
target_link_libraries (mainwindow Qt5::Widgets)

add_executable(MyProject main.cpp)
target_link_libraries (MyProject mainwindow)
错误

  • 错误的
    add\u executable
    指令。您试图添加库,但为此需要使用
    target\u link\u库
    。因此,不要:

    add_executable(Cmake main.cpp mainwindow)
    
    你需要:

    add_executable(Cmake main.cpp)
    target_link_libraries (Cmake mainwindow)
    
  • 还有一个错误是
    add_library
    指令中缺少
    *.cpp
    文件:

    add_库(mainwindow mainwindow.cpp${Cmake\u hdr\u moc}${Cmake\u form\u hdr})

  • 建议

  • 另外,设置
    CMake
    的版本也是合适的。如果使用
    CMake\u AUTOMOC
    您需要一个不低于2.8.6的版本,如果使用
    CMake\u AUTOUIC
    您需要一个不低于3.0.2的版本:

    cmake_minimum_required(VERSION 3.0.2)
    
  • 无需将
    qt5\u wrap\u cpp
    CMAKE\u AUTOMOC
    一起使用

  • 当您使用
    CMAKE_AUTOMOC
    用法
    CMAKE_AUTOUIC
    而不是
    qt5_wrap_ui
    时,将更合适

  • 此脚本适用于文件系统中具有以下结构的项目:

    Project
    ├── CMakeLists.txt
    ├── main.cpp
    ├── mainwindow.cpp
    ├── mainwindow.h
    └── mainwindow.ui
    
    如果你有另一个结构,你应该使用@steveire提到的
    include_目录

  • UPD)由于我写了这个答案,我多次建议初学者通过
    CMake
    Qt
    见面。他们抱怨项目的名称不恰当——“CMake”。对于刚接触到
    CMake
    的初学者来说,很难理解CMake-是项目名称的一部分(不是强制性的),而CMake是指令的一部分(是强制性的)。因此我想将项目名称从“CMake”改为“MyProject”.这减少了问题和答案之间的联系,但另一方面,这使答案对初学者更友好

  • UPD)正如@Erik Sjölund
    qt5_use_modules
    target_link_库
    所述,应改用

  • 注意:就个人而言,我在使用
    CMAKE_AUTOMOC
    方面有过失败的经验;它适用于结构简单的项目。当我的包含文件存储到单独的目录中时,我遇到了问题:

    .
    ├── include
    │   └── QtClass.h
    └── src
        └── QtClass.cpp
    
    当同名文件被放入不同的子目录时:

    .
    ├── NamespaceA
    │   ├── QtClass.cpp
    │   └── QtClass.h
    └── NamespaceB
        ├── QtClass.cpp
        └── QtClass.h
    
    最后: 这是一个基于我个人意见的建议,但我想建议脚本不使用
    CMAKE_AUTOMOC
    CMAKE_AUTOUIC
    ,它更详细,但另一方面,您有更多的控制权:

    cmake_minimum_required (VERSION 2.8.12)
    project (MyProject)
    
    find_package (Qt5Widgets)
    
    set (MyProjectLib_src ${PROJECT_SOURCE_DIR}/mainwindow.cpp)
    set (MyProjectLib_hdr ${PROJECT_SOURCE_DIR}/mainwindow.h)
    set (MyProjectLib_ui  ${PROJECT_SOURCE_DIR}/mainwindow.ui)
    set (MyProjectBin_src ${PROJECT_SOURCE_DIR}/main.cpp)
    
    qt5_wrap_cpp(MyProjectLib_hdr_moc ${MyProjectLib_hdr})
    qt5_wrap_ui (MyProjectLib_ui_moc  ${MyProjectLib_ui})
    
    include_directories (${PROJECT_SOURCE_DIR})
    include_directories (${PROJECT_BINARY_DIR})
    
    add_library (MyProjectLib SHARED 
        ${MyProjectLib_src}
        ${MyProjectLib_hdr_moc}
        ${MyProjectLib_ui_moc}
    )
    target_link_libraries (MyProjectLib Qt5::Widgets)
    
    add_executable(MyProject ${MyProjectBin_src})
    target_link_libraries (MyProject MyProjectLib)
    

    项目源代码的完整版本可在。

    您的*.ui文件是什么?我用.ui文件编辑了文章。到目前为止,我还没有对该文件做任何更改,它是自动生成的文件。您是在IDE中还是在文件系统中显示项目的结构?我显示的结构在IDE中,在文件系统中简单地说就是这样:当我使用Cmake构建我的项目时,它显示了目录结构:是的,它成功了,我正是使用了上面的脚本,找出了区别,我想问一下include_目录(${project_BINARY_DIR})是什么意思?它做了什么?我也删除了add_库。
    include_目录(${PROJECT_BINARY_DIR})
    告诉
    CMake
    在build目录中查找include文件。所有生成的文件都放在build目录中。@user387772,我已经找到了问题的根源,请看我的帖子。@GLUTTON automoc适合小项目,但我们必须从任何地方将其删除,因为当项目规模增大时,它会使速度停止.最好显式调用qt5_wrap_cpp@peterkarasev,谢谢分享你的经验!
    .
    ├── NamespaceA
    │   ├── QtClass.cpp
    │   └── QtClass.h
    └── NamespaceB
        ├── QtClass.cpp
        └── QtClass.h
    
    cmake_minimum_required (VERSION 2.8.12)
    project (MyProject)
    
    find_package (Qt5Widgets)
    
    set (MyProjectLib_src ${PROJECT_SOURCE_DIR}/mainwindow.cpp)
    set (MyProjectLib_hdr ${PROJECT_SOURCE_DIR}/mainwindow.h)
    set (MyProjectLib_ui  ${PROJECT_SOURCE_DIR}/mainwindow.ui)
    set (MyProjectBin_src ${PROJECT_SOURCE_DIR}/main.cpp)
    
    qt5_wrap_cpp(MyProjectLib_hdr_moc ${MyProjectLib_hdr})
    qt5_wrap_ui (MyProjectLib_ui_moc  ${MyProjectLib_ui})
    
    include_directories (${PROJECT_SOURCE_DIR})
    include_directories (${PROJECT_BINARY_DIR})
    
    add_library (MyProjectLib SHARED 
        ${MyProjectLib_src}
        ${MyProjectLib_hdr_moc}
        ${MyProjectLib_ui_moc}
    )
    target_link_libraries (MyProjectLib Qt5::Widgets)
    
    add_executable(MyProject ${MyProjectBin_src})
    target_link_libraries (MyProject MyProjectLib)