目前正在开发一个Qt项目,我也想使用Poco库的某些方面,例如属性文件配置功能。我在这里的文档第9页的代码中得到了示例: http://pocoproject.org/slides/180-Configuration.pdf
问题是在编译时会出现一些相当奇怪的格式化的未定义引用错误。
C:\projects\build-InternetofGauges-Desktop_Qt_5_5_1_MinGW_32bit-Debug\debug\webtunnelhandler.o:-1: In function `ZN16WebTunnelHandler13setConfigFileEv':
C:\projects\InternetofGauges\webtunnelhandler.cpp:41: error: undefined reference to `_imp___ZN4Poco4Util25PropertyFileConfigurationC1ERKSs'
C:\projects\InternetofGauges\webtunnelhandler.cpp:43: error: undefined reference to `_imp___ZNK4Poco4Util21AbstractConfiguration6getIntERKSs'
C:\projects\build-InternetofGauges-Desktop_Qt_5_5_1_MinGW_32bit-Debug\debug\webtunnelhandler.o:-1: In function `ZN4Poco7AutoPtrINS_4Util25PropertyFileConfigurationEEptEv':
C:\My-Devices-SDK\include\Poco\AutoPtr.h:190: error: undefined reference to `_imp___ZN4Poco20NullPointerExceptionC1Ei'
C:\My-Devices-SDK\include\Poco\AutoPtr.h:190: error: undefined reference to `_imp___ZN4Poco20NullPointerExceptionD1Ev'
collect2.exe:-1: error: error: ld returned 1 exit status
我的.pro文件
QT += core
QT += network
QT += sql
QT += xml
QT -= gui
CONFIG += c++11
TARGET = InternetofGauges
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
INCLUDEPATH += "C:\\My-Devices-SDK\\include" \
"C:\\OpenSSL\\MinGW\\include"
LIBS += -L"C:\\My-Devices-SDK\\lib\\" \
-lPocoUtild \
-lPocoNetd \
-lPocoNetSSLd \
-lPocoFoundationd \
-lPocoJSONd \
-lPocoWebTunneld \
-lPocoXMLd
LIBS += -L"C:\\My-Devices-SDK\\lib\\" \
-lPocoUtil \
-lPocoNet \
-lPocoNetSSL \
-lPocoFoundation \
-lPocoJSON \
-lPocoWebTunnel \
-lPocoXML
LIBS += -L"C:/OpenSSL/MinGW/lib/"
SOURCES += main.cpp \
webclient.cpp \
startuphandler.cpp \
webtunnelhandler.cpp
DISTFILES += \
Todo.readme
HEADERS += \
webclient.h \
startuphandler.h \
webtunnelhandler.h
有问题的问题代码
#include <Poco/Util/PropertyFileConfiguration.h>
#include <Poco/AutoPtr.h>
#include "webtunnelhandler.h"
using Poco::AutoPtr;
using Poco::Util::PropertyFileConfiguration;
/* ... */
void WebTunnelHandler::setConfigFile()
{
AutoPtr<PropertyFileConfiguration> pConf;
pConf = new PropertyFileConfiguration("WebTunnelAgent.properties");//Error appears here
int key1 = pConf->getInt("webtunnel.httpPort");//and also here
return;
}
现在,我已经使用MinGW编译了所有poco库,并且还为MinGW配置了Qt,并且编译并运行我的程序的其他部分。我也很高兴使用Qt 5.5.1和3.1.6 Qt Creator。不幸的是,我对Qt的快乐并没有帮助我解决问题。
我已经查看了许多关于类似主题的堆栈溢出问题,并尝试重新编译库以及明确地将这些库包含在.pro文件中。我也偷看了Auto.h文件,发现最终调用空指针异常可能是由于行pConf = new PropertyFileConfiguration("WebTunnelAgent.properties");
对我生气。
此错误的原因是什么?如何修复此错误?
答案 0 :(得分:0)
好的,所以我确实设法解决了这个问题。我意识到库的顺序确实很重要,因为在这种情况下库之间存在一些依赖关系。我还必须添加另一个特定于Windows的库以使其工作。这是工作的.pro文件的部分
LIBS += -L"C:\\My-Devices-SDK\\lib\\" \
-lPocoUtild \
-lPocoNetd \
-lPocoNetSSLd \
-lPocoXMLd \
-lPocoJSONd \
-lPocoWebTunneld \
-lPocoFoundationd
LIBS += -L"C:\\My-Devices-SDK\\lib\\" \
-lPocoUtil \
-lPocoNet \
-lPocoNetSSL \
-lPocoXML \
-lPocoJSON \
-lPocoWebTunnel \
-lPocoFoundation
LIBS += -L"C:/OpenSSL/MinGW/lib/"
win32:LIBS += -lIphlpapi
正如我上面所说的那样,需要Iphlpapi和poco订单。希望这最终有助于某人!
答案 1 :(得分:0)
链接图书馆matters的顺序与Poco无关:
链接器搜索并处理库中的库和目标文件 他们是指定的。因此,'foo.o -lz bar.o'搜索库 文件foo.o之后但在bar.o之前的'z'。如果bar.o指的是函数 在'z'中,可能无法加载这些函数。