使用Poco编译程序时出现“undefined reference Parser”问题求助
Poco编译时出现"未定义Parser"链接错误
问题详情
安装命令
./configure --no-tests --no-samples --omit=Data/ODBC,Data/MySQL,MongoDB,PDF --static --cflags=-fPIC --shared --prefix=/usr/local
测试代码
#include <Poco/JSON/Parser.h> #include <iostream> #include <string> int main(int argc, char **argv) { std::string json = "{ \"test\" : { \"property\" : \"value\", \"dog\": \"cat\" } }"; Poco::JSON::Parser parser; return 0; }
编译命令
g++ -std=c++14 -W -Wall -g json.cpp -o json -lPocoNet -lPocoUtil -lPocoJSON -lPocoFoundation -I /usr/local/include/
错误信息
/usr/bin/ld: /tmp/ccezP8gK.o: in function 'main': /root/test/json.cpp:9: undefined reference to Poco::JSON::Parser::Parser(Poco::SharedPtr<Poco::JSON::Handler, Poco::ReferenceCounter, Poco::ReleasePolicy<Poco::JSON::Handler> > const&)'
已尝试重装Poco、重新链接程序,/usr/local/include中存在Poco头文件,问题未解决。
解决方案
核心问题分析
- 编译选项冲突:configure同时指定
--static和--shared会导致Poco同时生成静态库与动态库,链接器可能无法正确识别所需库文件。 - 库链接顺序错误:Poco的库依赖需遵循「被依赖库放在依赖库之后」的规则,且测试代码无需链接
PocoNet和PocoUtil,冗余库可能干扰链接过程。
修复步骤
1. 重新编译安装Poco(明确库类型)
选择单一库类型重新编译,避免混淆:
- 动态库版本:
./configure --no-tests --no-samples --omit=Data/ODBC,Data/MySQL,MongoDB,PDF --shared --cflags=-fPIC --prefix=/usr/local make clean && make -j$(nproc) && sudo make install - 静态库版本:
./configure --no-tests --no-samples --omit=Data/ODBC,Data/MySQL,MongoDB,PDF --static --cflags=-fPIC --prefix=/usr/local make clean && make -j$(nproc) && sudo make install
2. 调整编译命令
移除冗余库,修正链接顺序:
g++ -std=c++14 -W -Wall -g json.cpp -o json -lPocoJSON -lPocoFoundation -I /usr/local/include/
若使用静态库,需确保链接器能找到静态库文件,可添加-L/usr/local/lib明确库路径(若系统默认未包含该路径)。
3. 验证库文件存在性
检查/usr/local/lib目录下是否存在libPocoJSON.so(动态库)或libPocoJSON.a(静态库),若不存在则说明安装过程出错,需查看configure和make的输出日志排查问题。
内容的提问来源于stack exchange,提问作者CoCo Cc
相关产品推荐
相关产品推荐

