Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 获得;未定义的引用;在为ARM使用库时,而不是在编译库时_Linux_Qt_Shared Libraries_Undefined Reference_.so - Fatal编程技术网

Linux 获得;未定义的引用;在为ARM使用库时,而不是在编译库时

Linux 获得;未定义的引用;在为ARM使用库时,而不是在编译库时,linux,qt,shared-libraries,undefined-reference,.so,Linux,Qt,Shared Libraries,Undefined Reference,.so,对于我的一个Qt嵌入式项目,我使用了一个名为SMTPEmail的外部Qt库。这个库需要在被包含到项目中之前进行编译,这是我在Qt4.8ARM和桌面上成功做到的 我遇到的问题是,当我将标题包含到项目中并将库包含在.pro中时,链接器会给我 (path_to_libs)/libSMTPEmail.so: undefined reference to `QSslSocket::connectToHostEncrypted(QString const&, unsigned short, QFla

对于我的一个Qt嵌入式项目,我使用了一个名为SMTPEmail的外部Qt库。这个库需要在被包含到项目中之前进行编译,这是我在Qt4.8ARM和桌面上成功做到的

我遇到的问题是,当我将标题包含到项目中并将库包含在.pro中时,链接器会给我

(path_to_libs)/libSMTPEmail.so: undefined reference to `QSslSocket::connectToHostEncrypted(QString const&, unsigned short, QFlags<QIODevice::OpenModeFlag>)'
(path_to_libs)/libSMTPEmail.so: undefined reference to `QSslSocket::QSslSocket(QObject*)'
collect2: ld returned 1 exit status
make: *** [re8k_interface-tgt] Error 1
(path_to_libs)/libSMTPEmail.so:对“qsslssocket::connectToHostEncrypted(QString const&,unsigned short,QFlags)”的未定义引用
(path_to_libs)/libSMTPEmail.so:对“QSslSocket::QSslSocket(QObject*)”的未定义引用
collect2:ld返回了1个退出状态
make:**[re8k_interface-tgt]错误1
但仅用于为ARM编译。在为ARM和Desktop编译lib时,使用lib为Desktop编译项目时正常,但使用lib为ARM编译项目时出错

接下来,我怀疑这可能是由于缺少指向openssl库文件的链接(在为不同环境编译时,项目指向不同的lib文件夹)。因此,我在ARM编译器(ARM arago linux gnueabi)中搜索了所有与“openssl”相关的文件,并将其包含在.So所在的同一文件夹中;同样的错误。然后我怀疑库本身有其他不在库路径中的依赖项,所以我做了一个
readelf-d libSMTPEmail.so
,后来在
.so.1
和readelf返回了一些库的不在同一文件夹中的库依赖项。然后我将所有这些依赖项复制到文件夹中,但也没有成功


那么会发生什么呢?我知道的所有依赖项都已就位,我仍然只在库包含在为ARM编译的另一个项目中的情况下才会得到错误。

您需要将QMake指向
.pro
文件中的libs和头文件

因此,找到您的库所在的位置,然后假设
/usr/local/include

INCLUDEPATH += /usr/local/include
添加您将使用的LIB

LIBS += -lSMTPEmail

你可以检查我的答案

在你的问题中,有两件事对我来说很突出:

一,

未定义的引用

此错误消息表示编译的链接步骤出错。当您包含函数/类/变量的头,但自己的源中没有包含定义,或者您没有链接到包含定义的静态库时,就会发生这种情况

在已编译的库(.dll或.so)中搜索依赖项为时已晚,编译器正在查找静态链接,而不是动态链接

二,

编译ARM和Desktop的lib就可以了,编译 使用lib的桌面项目运行正常,但为ARM编译它 使用lib会出错

这表明您在.pro文件中使用的是条件编译,它执行“两者”编译、“仅桌面”编译和“仅ARM”编译。如果这是正确的,您需要检查“仅ARM”编译的编译说明


错误消息本身指的是您使用
QSslStock
类中的两个函数。这些是
QtNetwork
模块的一部分,因此您的.pro文件中应该包含以下内容,以便形成必要的链接

Qt += network

我已经这么做了——还记得我能够使用Qt4.8进行桌面编译和链接吗?就在我专门为ARM编译的时候,问题出现了,我已经在尝试向它添加可能的SMTPEmail依赖项。