库路径绝对正确,可以创建所述库的实例,但在调用任何函数时会出现“未定义的引用”
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 来做我需要的事情。还从类中删除了函数。现在似乎一切正常:)以上是关于库路径绝对正确,可以创建所述库的实例,但在调用任何函数时会出现“未定义的引用”的主要内容,如果未能解决你的问题,请参考以下文章