Проблема со связыванием библиотеки C с проектом Qt

#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:

Вы должны манипулировать параметрами компилятора таким образом, чтобы:

  1. При сборке библиотеки у вас

     #define EXPORT __declspec(dllexport)
      
  2. При использовании библиотеки возникает

     #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 является самой важной. Теперь все работает нормально.