Проблема с подключением библиотеки C к проекту Qt - PullRequest
1 голос
/ 24 марта 2019

Я знаю, что это обсуждаемая тема 100 раз, но после ряда попыток я просто не могу найти решение, так как не понимаю ситуацию - никаких ошибок.Я пытаюсь подключить библиотеку dll "C" к своему проекту и получаю какой-то сумасшедший код в выводе приложения "... завершен с кодом -1073741515", а также пустую консоль с помощью Press, чтобы закрыть это окно ...

Итак, вот мой: 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

для сборки используемой мной библиотеки:

gcc -c mylib.c
gcc -shared -o mylib.dll -Wl,--out-implib,libmylib.a mylib.o

Буду признателен за некоторые подсказки ... Спасибо

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

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

  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 голос
/ 24 марта 2019

Итак, что я изменил после подсказок @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 является наиболее важной. Теперь все работает отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...