2013-09-17 2 views
1

Я начал новый проект QT Creator на основе шаблона SUBDIRS, а затем воссоздал два подпроекта; один DLL-проект и один exectuable, который должен использовать классы из DLL.Неразрешенный внешний с помощью QT Creator

Я добавил библиотеку DLL как «внутреннюю» библиотеку (а не как «внешнюю», потому что я понял, что это было в моем дереве сборки) исполняемому файлу. У меня есть класс, объявленный в моей DLL, и добавлен спецификатор «export».

У меня возникли проблемы с его использованием в проекте EXE. Он жалуется на неразрешенный внешний символ. Я попытался добавить «используя MyClass»; в верхней части main.cpp, но это не помогло. Что мне нужно на месте, прежде чем я смогу использовать класс из моего проекта DLL в исполняемом файле? Благодаря!

Вот несколько кодов, которые нужно добавить.

/////////// Main.cpp из исполняемого проекта ///////////////////////////// ///////////////////

#define USEDLL 1; 

#include <QCoreApplication> 
#include "../Library/myclass.h" 
#include <QDebug> 
#include <iostream> 

//__declspec(dllimport) MyClass; 


int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    __declspec(dllimport) MyClass g; 
    QString test; 

    test = MyClass::TheString(); 

    return a.exec(); 
} 

//////////////// Заголовок класса в DLL //// ////////////////////////////

#ifndef MYCLASS_H 
#define MYCLASS_H 

#include <QString> 

#ifdef ISDLL 
    #define DLL __declspec(dllexport) 
#endif 

#ifdef USEDLL 
    #define DLL __declspec(dllimport) 
#endif 

class DLL MyClass 
{ 

public: 
    MyClass(); 
    static QString TheString(); 
}; 

#endif // MYCLASS_H 

/////////////// /// Класс cpp из проекта DLL /////////////////////////

#define ISDLL 1; 

#include "myclass.h" 

MyClass::MyClass() 
{ 
} 

QString MyClass::TheString() 
{ 
    return "test"; 
} 

//////////////////////////// Выход компилятора /////////////////// /////////

11:09:59: Running steps for project Top... 
11:09:59: Configuration unchanged, skipping qmake step. 
11:09:59: Starting: "C:\Qt\Tools\QtCreator\bin\jom.exe" 
    cd Library\ && (if not exist Makefile C:\Qt\5.1.1\msvc2010\bin\qmake.exe D:\Projects\Top\Library\Library.pro -spec win32-msvc2010 CONFIG+=debug CONFIG+=declarative_debug CONFIG+=qml_debug -o Makefile) && C:\Qt\Tools\QtCreator\bin\jom.exe -f Makefile 
    C:\Qt\Tools\QtCreator\bin\jom.exe -f Makefile.Debug 
    cd App\ && (if not exist Makefile C:\Qt\5.1.1\msvc2010\bin\qmake.exe D:\Projects\Top\App\App.pro -spec win32-msvc2010 CONFIG+=debug CONFIG+=declarative_debug CONFIG+=qml_debug -o Makefile) && C:\Qt\Tools\QtCreator\bin\jom.exe -f Makefile 
    C:\Qt\Tools\QtCreator\bin\jom.exe -f Makefile.Debug 
    cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MDd -GR -W3 -w34100 -w34189 -EHsc -DUNICODE -DWIN32 -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_CORE_LIB -I"C:\Qt\5.1.1\msvc2010\include" -I"C:\Qt\5.1.1\msvc2010\include\QtCore" -I"debug" -I"." -I"C:\Qt\5.1.1\msvc2010\mkspecs\win32-msvc2010" -Fodebug\ @C:\Users\philip\AppData\Local\Temp\main.obj.4512.0.jom 
main.cpp 
    echo 1 /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 24 /* RT_MANIFEST */ "debug\\App.exe.embed.manifest">debug\App.exe_manifest.rc 
    if not exist debug\App.exe if exist debug\App.exe.embed.manifest del debug\App.exe.embed.manifest 
    if exist debug\App.exe.embed.manifest copy /Y debug\App.exe.embed.manifest debug\App.exe_manifest.bak 
    link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:debug\App.exe.embed.manifest /OUT:debug\App.exe @C:\Users\philip\AppData\Local\Temp\App.exe.4512.687.jom 
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class QString __cdecl MyClass::TheString(void)" ([email protected]@@[email protected]@XZ) referenced in function _main 
debug\App.exe : fatal error LNK1120: 1 unresolved externals 
jom: D:\Projects\build-Top-Desktop_Qt_5_1_1_MSVC2010_32bit-Debug\App\Makefile.Debug [debug\App.exe] Error 1120 
jom: D:\Projects\build-Top-Desktop_Qt_5_1_1_MSVC2010_32bit-Debug\App\Makefile [debug] Error 2 
jom: D:\Projects\build-Top-Desktop_Qt_5_1_1_MSVC2010_32bit-Debug\Makefile [sub-App-make_first-ordered] Error 2 
11:10:00: The process "C:\Qt\Tools\QtCreator\bin\jom.exe" exited with code 2. 
Error while building/deploying project Top (kit: Desktop Qt 5.1.1 MSVC2010 32bit) 
When executing step 'Make' 
11:10:00: Elapsed time: 00:01. 

ответ

0

Вы отправили его в LIBS в профайле? Проверьте файлы make для флагов компоновщика.

+0

думаю. GUI Creator GUI вставил следующее в файл pro для EXE: win32: CONFIG (выпуск, отладка | выпуск): LIBS + = -L $$ OUT_PWD /../ GCDCore/release/-lGCDCore else: win32 : CONFIG (debug, debug | release): LIBS + = -L $$ OUT_PWD /../ GCDCore/debug/-lGCDCore else: unix: LIBS + = -L $$ OUT_PWD /../ GCDCore/-lGCDCore INCLUDEPATH + = $$ PWD /../ GCDCore DEPENDPATH + = $$ PWD /../ GCDCore – user2723146

+0

Вы добавили __declspec (dllexport) ко всем экспортированным классам? – mugiseyebrows

+0

Да. Я попробовал оба спецификатора, которые вы предложили (класс __declspec (dllexport) MyProject), а также используя макрос, определенный в файле _global.h. Я включил это в файл .h. Не повезло – user2723146

Смежные вопросы