C++ 未定义对一角钱库的引用,无法在QT中编译

C++ Undefined Reference to Dime Library, Can't compile in QT

本文关键字:引用 编译 QT 钱库 未定义 一角 C++      更新时间:2023-10-16

类似的问题可能会被问很多次。然而,我无法用目前的任何答案来解决我的问题。我希望能尽快得到答复。

QT C++中,我尝试使用Dime库,它来自:https://bitbucket.org/Coin3D/dime/overview

我有一个编译过的windows Dime库的.lib文件。它在Visual Studio下与我朋友的机器一起工作。所以我有了所有的头和dime.lib文件。

在我的.pro文件中,我做了:

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = dimeTest
TEMPLATE = app
SOURCES += main.cpp
        mainwindow.cpp
HEADERS  += mainwindow.h
FORMS    += mainwindow.ui
LIBS += -L$$PWD/src/release/ -ldime
INCLUDEPATH += $$PWD/src
DEPENDPATH += $$PWD/src
PRE_TARGETDEPS += $$PWD/src/release/dime.lib
INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

$$PWD/include文件夹包含所有.h头文件。$$PWD/src/release包括该lib文件。

在我的main.cpp中,我只是试图将一个变量定义为DimeLine,但无法实现。这是来自一个新的qt项目。

#include "mainwindow.h"
#include <QApplication>
#define DIME_NOT_DLL
#include <dime/entities/Line.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    dimeLine line; //please help!! :)
    return a.exec();
}

错误输出:

undefined reference to `dimeLine::dimeLine()'
undefined reference to `vtable for dimeExtrusionEntity'
undefined reference to `dimeEntity::~dimeEntity()'
undefined reference to `vtable for dimeExtrusionEntity'
undefined reference to `dimeEntity::~dimeEntity()'
:-1: error: release/main.o: bad reloc address 0x13 in section `.eh_frame'
collect2.exe:-1: error: error: ld returned 1 exit status

请帮我编译,我如何在QT项目中使用Dime库?我尝试了许多方法来编写正确的.pro文件。没有一个奏效。总是有和未定义的引用"我使用的内容"相同的错误消息。我总是干干净净;qmake。

上面的当前.pro文件是通过点击项目上的"添加库"选项自动创建的。

我希望,一个有经验的人可以很容易地编译这个。

一切顺利!

更新*1我正试图在我的机器上重新编译Dime,问题可能是试图将vs lib用于qt,如果有人能帮助我编译Dime的话:https://bitbucket.org/Coin3D/dime/overview在QT Creator的windows机器上(使用mingw g++(我会非常高兴!!

在查看Dime源代码后,我注意到它需要使用以下两个定义之一:DIME_DLLDIME_NOT_DLL。我假设,您将静态地链接到dime库,所以,根据注释,您必须使用DIME_NOT_DLL定义。您可以在.pro文件中添加以下行:

DEFINES += DIME_NOT_DLL

我用msys在windows机器上编译DIME库解决了这个问题。在这里,我想分享一下我采取了哪些步骤,犯了哪些错误:我希望它能帮助其他人。

-首先,我从一个朋友那里得到了一个.lib文件,他正在使用Visual Studio,但我发现这根本不适合minwg g++。

-因此,如果使用Visual C++编译库,则会得到一个.lib文件。然而,当我在msys控制台上用g++mingw编译它时,我得到了一个.a文件,该文件与QT创建者配合良好

-同样在ubuntu下,有一个已经编译过的库libdime版本,文件是libdime.so,但不要试图让它在windows上运行:(

用于编译Dime库,

1-(从下载所有源项目https://bitbucket.org/Coin3D/dime

2-(安装Mingw+msys,并确保您将">C:\Mingw\bin"添加到您的路径中,因为msys无论如何都需要它,然后使用msys控制台。CD到你的一角硬币文件夹。

3-(首先需要配置它,

./configure --prefix=c:/yourDestinationForCompiledDIME

4-(您可以检查make是否可以正常工作。在运行make、configure etc命令的dime文件夹上不要有任何空间,否则可能会失败。

make check

5-(使其成为

make

6-(现在安装,。

make install

这些是编译Dime的步骤,现在将其添加到QT项目中

现在,将c:\yourDestinationForCompiledDIME中的/lib和/include/文件夹复制到您的项目文件夹中。Lib文件夹应该有.a库,include有头文件。这些都是您向QT添加库所需要的。

在.pro文件中:

win32: LIBS += -L$$PWD/lib/ -ldime
INCLUDEPATH += $$PWD/lib
DEPENDPATH += $$PWD/lib
win32-g++: PRE_TARGETDEPS += $$PWD/lib/libdime.a
INCLUDEPATH += $$PWD/include

在您的cpp代码中,要点如下。

#define DIME_NOT_DLL 

当然还有你的头,不管你需要什么。。

#include <dime/entities/Line.h>

所有的cpp代码类似于:

#include "mainwindow.h"
#include <QApplication>
#define DIME_NOT_DLL
#include <dime/entities/Line.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    dimeLine line; //please help!! :)
    return a.exec();
}

我希望这将有助于谁需要起诉Dime在QT项目。

祝你一切顺利,。。