2014-09-23 9 views
32

के माध्यम से क्यूटी परियोजना को कार्यान्वित करना मैं .pro फ़ाइल के माध्यम से क्यूके के माध्यम से क्यूटी के बहुत सरल और मूल उदाहरण को चलाने और चलाने की कोशिश कर रहा हूं। निम्नलिखित क्यूटी परियोजना (क्यूटी परियोजना स्वचालित रूप से उत्पन्न के लिए निर्देशिका संरचना के लिए कोडसीएमके

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

mainwindow.h

#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 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

main.cpp है

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

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

    return a.exec(); 
} 

यह मेरा CmakeLists.txt है

project(Cmake) 

find_package(Qt5Widgets) 

set(CMAKE_AUTOMOC ON) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 

QT5_WRAP_CPP(Cmake_hdr_moc mainwindow.h) 
QT5_WRAP_UI(Cmake_form_hdr mainwindow.ui) 

add_library(mainwindow ${Cmake_hdr_moc} ${Cmake_form_hdr}) 
qt5_use_modules(mainwindow Widgets) 

add_executable(Cmake main.cpp mainwindow) 
qt5_use_modules(Cmake Core Gui Widgets) 

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>MainWindow</class> 
<widget class="QMainWindow" name="MainWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>400</width> 
    <height>300</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>MainWindow</string> 
    </property> 
    <widget class="QWidget" name="centralWidget"/> 
    <widget class="QMenuBar" name="menuBar"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>400</width> 
    <height>29</height> 
    </rect> 
    </property> 
    </widget> 
    <widget class="QToolBar" name="mainToolBar"> 
    <attribute name="toolBarArea"> 
    <enum>TopToolBarArea</enum> 
    </attribute> 
    <attribute name="toolBarBreak"> 
    <bool>false</bool> 
    </attribute> 
    </widget> 
    <widget class="QStatusBar" name="statusBar"/> 
</widget> 
<layoutdefault spacing="6" margin="11"/> 
<resources/> 
<connections/> 
</ui> 

जब मैं परियोजना का निर्माण और CMake चलाने के लिए, यह ui_mainwindow.h 'ऐसी कोई फाइल नहीं संकेत mainwindow.h दायर करने के लिए कहते हैं या निर्देशिका।

+0

आपकी * .ui फ़ाइल कौन है? – Gluttton

+0

मैंने पोस्ट को .ui फ़ाइल के साथ संपादित किया है। अब तक मैंने उस फ़ाइल में कोई भी बदलाव नहीं किया है, यह स्वचालित रूप से जेनरेट की गई फ़ाइल है। – user3877872

+0

क्या आप आईडीई में या फाइल सिस्टम में अपनी परियोजना की संरचना दिखाते हैं? – Gluttton

उत्तर

55

आपकी स्क्रिप्ट में कई त्रुटियां हैं, कुछ चीजों में भी सुधार किया जा सकता है। परिवर्तन के बाद it will be लगता है:

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) 

त्रुटियाँ:

  1. गलत add_executable निर्देश। आप लाइब्रेरी जोड़ने का प्रयास करते हैं, लेकिन इस उद्देश्य के लिए आपको target_link_libraries का उपयोग करने की आवश्यकता है। तो बजाय:

    add_executable(Cmake main.cpp mainwindow) 
    

    आप की जरूरत है:

    add_executable(Cmake main.cpp) 
    target_link_libraries (Cmake mainwindow) 
    
  2. और एक और गलती add_library निर्देश में *.cpp फ़ाइलों याद आ रही है:

    add_library(mainwindow mainwindow.cpp ${Cmake_hdr_moc} ${Cmake_form_hdr})

recomendations:

  1. इसके अलावा CMake के संस्करण की स्थापना उपयुक्त होगा। यदि आप CMAKE_AUTOMOC का उपयोग करते हैं तो आपको 2.8.6 से कम संस्करण की आवश्यकता नहीं है, और यदि आप CMAKE_AUTOUIC का उपयोग करते हैं तो आपको 3.0 से कम संस्करण की आवश्यकता नहीं है।2:

    cmake_minimum_required(VERSION 3.0.2) 
    
  2. CMAKE_AUTOMOC साथ qt5_wrap_cpp का उपयोग करना आवश्यक नहीं है।

  3. जब आप CMAKE_AUTOMOC उपयोग qt5_wrap_ui के बजाय उपयोग अधिक उपयुक्त होंगे।

  4. यह स्क्रिप्ट फाइल सिस्टम में निम्नलिखित संरचना के साथ परियोजना के लिए सही है:

    Project 
    ├── CMakeLists.txt 
    ├── main.cpp 
    ├── mainwindow.cpp 
    ├── mainwindow.h 
    └── mainwindow.ui 
    

    यदि आप किसी अन्य संरचना आप include_directories का उपयोग करना चाहिए के रूप में द्वारा @steveire उल्लेख किया गया था है।

  5. (युपीडी) के बाद से, मैं इस सवाल का जवाब लिखा है, मैं इसे शुरुआती जो CMake के माध्यम से Qt साथ मिलने की कोशिश के लिए कई बार सुझाव दिया। वे परियोजना के अनुचित नाम की शिकायत करते हैं - "सीमेक"। शुरुआती लोगों के लिए जो CMake से मिलते हैं, उन्हें यह समझना मुश्किल होता है कि सेमीके - परियोजना नाम का हिस्सा है (और अनिवार्य नहीं है) और जहां सेमीके निर्देश का हिस्सा है (और अनिवार्य है)। तो मैं प्रोजेक्ट के नाम को "सेमेक" से "मायप्रोजेक्ट" में बदलना चाहता हूं। यह प्रश्न और उत्तर के बीच कनेक्शन को कम करता है, लेकिन दूसरी तरफ यह उत्तर शुरुआती लोगों के लिए अधिक अनुकूल बनाता है।

  6. (युपीडी) के रूप में @Erik Sjölund द्वारा उल्लेख किया गया था qt5_use_modulesis obsolete और target_link_libraries बजाय प्रयोग किया जाना चाहिए।

नोट: व्यक्तिगत तौर पर मैं CMAKE_AUTOMOC साथ असफल अनुभव है; सादे संरचना के साथ सरल परियोजना के लिए यह अच्छा है। मैं मामले के साथ समस्याओं पड़ा है जब मेरे शामिल फ़ाइलें अलग निर्देशिका में जमा हो गया था:

. 
├── include 
│   └── QtClass.h 
└── src 
    └── QtClass.cpp 

और जब एक ही नाम के साथ फ़ाइलों को अलग निदेशिकाओं में थे:

. 
├── NamespaceA 
│   ├── QtClass.cpp 
│   └── QtClass.h 
└── NamespaceB 
    ├── QtClass.cpp 
    └── QtClass.h 

अंत में: यह वह जगह है मेरी व्यक्तिगत राय के आधार पर सुझाव, लेकिन मैं और CMAKE_AUTOUIC के उपयोग के बिना स्क्रिप्ट के more explicit version का प्रस्ताव देना चाहता हूं, यह अधिक वर्बोज़ है लेकिन दूसरी ओर आपके पास अधिक नियंत्रण है:

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) 

प्रोजेक्ट स्रोत कोड का पूरा संस्करण GitLab पर उपलब्ध है।

+0

हां, यह काम करता है, मैंने उपर्युक्त स्क्रिप्ट का उपयोग किया है, अंतरों को ढूंढने के लिए मैं पूछना चाहता हूं कि include_directories ($ {PROJECT_BINARY_DIR}) का क्या अर्थ है? यह क्या करता है? और मैंने add_library भी हटा दिया। – user3877872

+0

'include_directories ($ {PROJECT_BINARY_DIR}) 'सीएमके' में कहता है कि बिल्ड निर्देशिका में फाइलें शामिल हैं। सभी जेनरेट की गई फाइलें बिल्ड निर्देशिका में रखी गई हैं। – Gluttton

+0

@ user3877872, मुझे समस्याओं का स्रोत पता चला है, कृपया मेरी पोस्ट देखें। – Gluttton

0

आपने हमें यह नहीं दिखाया कि CMakeLists.txt निर्देशिका संरचना में कहां है। यह शीर्ष-स्तर पर है तो आप

add_executable(Cmake sources/main.cpp sources/mainwindow.cpp) 

होगा और आप

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/headers) 

वैसे भी आवश्यकता होगी, बाहर जहां ui _ *। ज फ़ाइल उत्पन्न किया जा रहा है, और include_directories साथ निर्देशिका जोड़ें।

+0

जब मैं सीमेक का उपयोग करके अपनी परियोजना का निर्माण करता हूं, तो यह निर्देशिका संरचनाओं को दिखाता है: http: // imgur ।com/nntQ7O5 – user3877872