将C库链接到Qt项目的问题

时间:2019-03-24 06:34:41

标签: c++ c qt

我知道这是100次讨论的话题,但是经过多次尝试,我还是找不到解决方案,因为不了解情况-没有错误。 我正在尝试将DLL“ C”库连接到我的项目,并在App输出中收到一些疯狂的代码“ ...代码为-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

希望获得一些提示...谢谢

2 个答案:

答案 0 :(得分:2)

您必须对编译器选项进行以下操作:

  1. 构建库时,您已经拥有

    #define EXPORT __declspec(dllexport)
    
  2. 使用库时,您拥有

    #define EXPORT __declspec(dllimport)
    

一种方法是使用:

#if defined(BUILD_DLL)
   #define EXPORT __declspec(dllexport)
#else
   #define EXPORT __declspec(dllimport)
#endif

然后在构建DLL时使用-DBUILD_DLL,并在使用DLL时将其保留为未定义状态。

答案 1 :(得分:1)

因此,根据@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文件中的那一行是最重要的。现在一切正常。