库路径绝对正确,可以创建所述库的实例,但在调用任何函数时会出现“未定义的引用”

Posted

技术标签:

【中文标题】库路径绝对正确,可以创建所述库的实例,但在调用任何函数时会出现“未定义的引用”【英文标题】:Library path is definitely correct and can create an instance of said library, but get "Undefined reference" when calling any function 【发布时间】:2018-01-18 16:10:57 【问题描述】:

我正在使用 Qt Creator 创建一个新项目,并且我有一个在 Visual Studio 中创建的测试“MathLibrary”。我想在我的 Qt 项目中使用这个库。

我已经搜索了很多小时来寻找我的解决方案的答案,并且几乎在所有情况下,答案都只是该库没有被添加到 .pro 文件中的 PATH 中。我 99% 确定我所做的一切都是正确的,但是当我尝试调用这个库中的任何函数时,某些事情导致我得到一个未定义的引用错误。这是我目前所拥有的。

图书馆 -

数学库H.h:

#pragma once

namespace MathLibrary

    class Functions
    
    public:
        // Returns a + b  
        double Add(double a, double b);

        // Returns a * b  
        double Multiply(double a, double b);

        // Returns a + (a * b)  
        double AddMultiply(double a, double b);
    ;

MathLibrary.cpp:

#include "stdafx.h"
#include "MathLibraryH.h"

namespace MathLibrary

    double Functions::Add(double a, double b)
    
        return a + b;
    

    double Functions::Multiply(double a, double b)
    
        return a * b;
    

    double Functions::AddMultiply(double a, double b)
    
        return a + (a * b);
    

QT 项目 -

TestQTProject.pro:

    QT       += core gui \
            network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = TestQTProject
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp \

HEADERS += \
        mainwindow.h \

FORMS += \
        mainwindow.ui

DISTFILES += \
    com_github_msorvig_s3.pri

LIBS += -L$$PWD/../Libs -lMathLibrary

INCLUDEPATH += $$PWD/../Incs

主窗口.cpp:

#include "MathLibraryH.h"

// .... other stuff ....

void MainWindow::on_btnStage1_clicked()

    MathLibrary::Functions lib; // This is just fine
    lib.Add(5, 9); // The "Add" function (or any other function in the library)
                       causes an undefined reference error

我还是 Qt 的新手,但我看不出这段代码有什么问题。

根据搜索结果我尝试过的其他事情:

将以下代码添加到 MathLibrary.h:

#ifdef MATHLIBRARY_EXPORTS  
#define MATHLIBRARY_API __declspec(dllexport)   
#else  
#define MATHLIBRARY_API __declspec(dllimport)   
#endif  

将 .pro 文件中的 LIBS 声明格式更改为以下所有格式:

多行:

LIBS += -L$$PWD/../Libs
LIBS += -lMathLibrary

硬编码单行:

LIBS += -LC:\svn\software\WIP\TestQTProject\Libs -lMathsLibrary

我没有做任何工作,我也没有其他想法。

对于它的价值,该库在使用 Visual Studio 创建的任何项目中都可以正常工作,我尝试创建静态库和动态库。

【问题讨论】:

更改为LIBS += -L"C:\svn\software\WIP\TestQTProject\Libs" -lMathsLibrary 恐怕同样的问题 - 引号似乎没有太大变化 【参考方案1】:

添加

MATHLIBRARY_API

在你的类名前面导出你的 dll 中的所有公共成员。在导出过程中应该设置 dllexport 部分,在导入过程中当然应该设置 dllimport 部分。

这里有一个链接,它解释了如何从 dll 中导出类: https://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL

【讨论】:

非常感谢您的回复 - 通过使用 QT 的 QLibrary,从类中删除函数并将它们包装在 extern "C" 块周围,我设法解决了这个问题 :)【参考方案2】:

如果您尝试动态链接,问题是您的库MathsLibrary 没有导出为动态库,您也没有将其导入为动态库 em> (这就是__declspec(dllexport) 所做的,并且应该在函数或类声明的前面使用宏以产生任何影响)。即使你这样做了,你也有可能编译它与你的 Qt 应用程序不同,所以会有一个链接问题。

但是由于您尝试静态链接(我没有看到在您的代码中加载任何库文件),问题似乎是您的库的编译和您的 Qt 应用程序之间的差异.

您应该尝试使用与您构建库相同的标志和相同的编译器来构建您的 Qt 应用程序,反之亦然。如果您的代码按您说的那样运行,那么它可能会起作用。

更多详情:

DL Library

How to Create a Plugin Framework

Building plugins using Qt Framework

【讨论】:

感谢您的回复 - 我正在动态链接它并将函数声明和定义包装在 extern "C" 块周围,并使用 QT 的 QLibrary 来做我需要的事情。还从类中删除了函数。现在似乎一切正常:)

以上是关于库路径绝对正确,可以创建所述库的实例,但在调用任何函数时会出现“未定义的引用”的主要内容,如果未能解决你的问题,请参考以下文章

vc动态链接库的调用 LoadLibrary()路径问题

QT creator 如何调用VC写的静态库

请教关于linux中静态库与动态库的问题

java中JNative调用dll绝对路径为啥找不到dll

iOS 之.a静态库创建、打包以及静态库之间的引用

UNIX基础知识