Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
用cmake编译qt库_Qt_Cmake - Fatal编程技术网

用cmake编译qt库

用cmake编译qt库,qt,cmake,Qt,Cmake,我为我愚蠢的问题感到抱歉。我正试图用cmake从带有Qt对象的类编译dll。库包含使用其他文件中定义的类的函数。在链接过程中,我得到了对类成员的错误“未定义引用”。 CMakeList.txt中的错误在哪里 CMakeList.txt: cmake_minimum_required(VERSION 2.8) project(foo) set(SOURCE_LIB foo.cpp window.cpp) find_package (Qt4 REQUIR

我为我愚蠢的问题感到抱歉。我正试图用cmake从带有Qt对象的类编译dll。库包含使用其他文件中定义的类的函数。在链接过程中,我得到了对类成员的错误“未定义引用”。 CMakeList.txt中的错误在哪里

CMakeList.txt:

cmake_minimum_required(VERSION 2.8) 
project(foo)            
set(SOURCE_LIB foo.cpp window.cpp)          
find_package (Qt4 REQUIRED)
include (${QT_USE_FILE})
ADD_DEFINITIONS(-DFOO_LIBRARY)
add_library(foo SHARED ${SOURCE_LIB})   
target_link_libraries(foo ${QT_LIBRARIES})
foo.h:

#ifndef FOO_H
#define FOO_H

#include "foo_global.h"

void FOOSHARED_EXPORT hello_world();
#endif // FOO_H
foo.cpp:

#include <QApplication>
#include <QMessageBox>
#include "window.h"

void hello_world()
{
    int argc = 0;
    char ** argv = (char **) 0;
    QApplication a(argc, argv);
    Window *w = new Window();
    w->Msg();
}

包含
Q_OBJECT
宏的类的所有头都必须由元对象编译器处理。 因此,您的cmake文件应如下所示:

cmake_minimum_required(VERSION 2.8) 
project(foo)            
set(LIB_SOURCE foo.cpp window.cpp)          
set(LIB_HEADER foo.h)
find_package (Qt4 REQUIRED)
include (${QT_USE_FILE})
ADD_DEFINITIONS(-DFOO_LIBRARY)

QT4_WRAP_CPP(LIB_HEADER_MOC ${LIB_HEADER})

add_library(foo SHARED ${LIB_SOURCE} ${LIB_HEADER_MOC})   
target_link_libraries(foo ${QT_LIBRARIES})
#include <QMessageBox>
#include "window.h"

void Window :: Msg()
{
    QMessageBox *msg = new QMessageBox();
    msg->setText("hello");
    msg->exec();
}
#ifndef WINDOW_H
#define WINDOW_H

#include <QtGui>

class Window
{
    Q_OBJECT
public:
    void Msg();

};

#endif // WINDOW_H
Test\build>c:\MinGW\bin\mingw32-make.exe
Scanning dependencies of target foo
[ 50%] Building CXX object CMakeFiles/foo.dir/foo.cpp.obj
[100%] Building CXX object CMakeFiles/foo.dir/window.cpp.obj
Linking CXX shared library libfoo.dll
Creating library file: libfoo.dll.a
CMakeFiles\foo.dir/objects.a(foo.cpp.obj):foo.cpp:(.text$_ZN6WindowC1Ev[Window::
Window()]+0x8): undefined reference to `vtable for Window'
collect2: ld returned 1 exit status
mingw32-make[2]: *** [libfoo.dll] Error 1
mingw32-make[1]: *** [CMakeFiles/foo.dir/all] Error 2
mingw32-make: *** [all] Error 2
cmake_minimum_required(VERSION 2.8) 
project(foo)            
set(LIB_SOURCE foo.cpp window.cpp)          
set(LIB_HEADER foo.h)
find_package (Qt4 REQUIRED)
include (${QT_USE_FILE})
ADD_DEFINITIONS(-DFOO_LIBRARY)

QT4_WRAP_CPP(LIB_HEADER_MOC ${LIB_HEADER})

add_library(foo SHARED ${LIB_SOURCE} ${LIB_HEADER_MOC})   
target_link_libraries(foo ${QT_LIBRARIES})