C++ 通过CMake实现Qt项目
我正试图通过Cmake构建和运行非常简单和基本的Qt示例,删除.pro文件。 以下是Qt项目的代码(自动生成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 (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_目录
CMake
与Qt
见面。他们抱怨项目的名称不恰当——“CMake”。对于刚接触到CMake
的初学者来说,很难理解CMake-是项目名称的一部分(不是强制性的),而CMake是指令的一部分(是强制性的)。因此我想将项目名称从“CMake”改为“MyProject”.这减少了问题和答案之间的联系,但另一方面,这使答案对初学者更友好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)