#c #c #qt
#c #c #qt
Вопрос:
Я знаю, что это тема, обсуждаемая 100 раз, но после нескольких попыток я просто не могу найти решение, поскольку не понимаю ситуацию — ошибок нет. Я пытаюсь подключить библиотеку dll «C» к своему проекту и получаю какой-то сумасшедший код в выводе приложения «… exited with code -1073741515», а также пустую консоль с нажатием, чтобы закрыть это окно…
Итак, вот мои: mylib.c:
#include "mylib.h"
int mysum(int a, int b){
return a b;
}
mylib.h:
#ifdef __cplusplus
extern "C" {
#endif
#define EXPORT __declspec(dllexport)
EXPORT int mysum(int, int);
#ifdef __cplusplus
}
#endif
testlib.pro:
QT -= gui
CONFIG = c 11 console
CONFIG -= app_bundle
SOURCES =
main.cpp
LIBS = -L$$PWD/../../../../TestDLL/ -lmylib
INCLUDEPATH = $$PWD/../../../../TestDLL
DEPENDPATH = $$PWD/../../../../TestDLL
HEADERS =
../../../../TestDLL/mylib.h
main.cpp:
#include <QCoreApplication>
#include "mylib.h"
#include <QtDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<mysum(1,2);
return a.exec();
}
Я думаю, мне чего-то не хватает со связью в файле pro, но не могу понять, чего.
TestDLL — это папка с:
mylib.dll mylib.h mylib.c libmylib.a
для сборки библиотеки dll я использовал:
gcc -c mylib.c
gcc -shared -o mylib.dll -Wl,--out-implib,libmylib.a mylib.o
Будем признательны за некоторые подсказки… Спасибо
Комментарии:
1.
-1073741515
является0xC0000135
, который, в свою очередь, являетсяSTATUS_DLL_NOT_FOUND
Ответ №1:
Вы должны манипулировать параметрами компилятора таким образом, чтобы:
-
При сборке библиотеки у вас
#define EXPORT __declspec(dllexport)
-
При использовании библиотеки возникает
#define EXPORT __declspec(dllimport)
Один из способов сделать это — использовать:
#if defined(BUILD_DLL)
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
А затем используйте -DBUILD_DLL
при сборке библиотеки DLL и оставьте ее неопределенной при использовании библиотеки DLL.
Комментарии:
1. @R Sahu, спасибо! Не могли бы вы, пожалуйста, также добавить строку о перемещении dll-файла в папку debug, чтобы я пометил ваше сообщение как ответ?
2. @AlexanderLyapin, в чем проблема с «перемещением dll-файла в папку отладки»?
3. Во время запуска программы TestDll, mylib.dll файл находился за пределами папки debug / release, что привело к получению этого кода. Я добавил ее в папку debug / release (также попробовал вариант с ее компоновкой с помощью файла pro), и все работает.
4. @AlexanderLyapin, я полностью пропустил это. Спасибо за разъяснение. Похоже, вы застряли на одной проблеме, в то время как я давал вам решение второй проблемы.
5. @R Sahu, но твои подсказки тоже действительно полезны!
Ответ №2:
Итак, что я изменил, следуя подсказкам @R Sahu:
в mylib.h :
#ifdef BUILDING_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
и для компиляции dll:
gcc -c -DBUILDING_DLL mylib.c
gcc -shared -o mylib.dll mylib.o -Wl,--out-implib,libmylib.a
Плюс в файле .pro:
LIBS = "$$PWD/../../../../TestDLL/mylib.dll"
Я считаю, что строка в файле .pro является самой важной. Теперь все работает нормально.