在为ARM使用lib时获取“未定义的引用”,但在编译它时则不行

时间:2015-12-10 11:56:28

标签: linux qt shared-libraries undefined-reference .so

对于我的一个Qt Embedded项目,我正在使用名为SMTPEmail的外部Qt库。这个lib需要在被包含到项目之前进行编译,这是我为Qt 4.8 ARM和桌面设置成功的东西。

我遇到的问题是,当我将标题包含到我的项目中并将库包含在.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

用于编译ARM。 IOW为ARM和桌面编译lib是正常的,使用lib编译桌面的项目没问题但是使用lib编译它的ARM出错了。

关注this forum thread我怀疑这可能是因为缺少了openssl库文件的链接(当编译不同的环境时,项目指向不同的lib文件夹)。所以我在ARM(arm-arago-linux-gnueabi)的编译器中搜索了所有“openssl”相关文件,并包含在.so所在的同一文件夹中;同样的错误。然后我怀疑lib本身有其他依赖,而不是在path_to_libs中,所以我做了readelf -d libSMTPEmail.so后来在.so.1中,readelf确实返回了一些不在同一个文件夹里面的lib依赖项。图书馆。然后我将所有这些依赖项复制到文件夹中,但也没有成功。

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

2 个答案:

答案 0 :(得分:0)

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

然后找到你的图书馆所在的地方/usr/local/include;

INCLUDEPATH += /usr/local/include

添加您将使用的库;

LIBS += -lSMTPEmail

您可以查看我的回答here;

答案 1 :(得分:0)

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

1

  

的未定义引用

此错误消息表示编译的链接步骤中存在错误。如果您在函数/类/变量中包含标题但未在自己的源中包含该定义,或者您没有链接到静态库中,则会发生这种情况。

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

2

  

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

这表明你在你的.pro文件中使用条件编译来执行&#34;两者&#34;汇编,仅限桌面&#34;汇编和&#34;仅限ARM&#34;汇编。如果这是正确的,您需要检查您的&#34;仅ARM的编译说明&#34;汇编

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

Qt += network