对于我的一个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的情况得到错误。
答案 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