SWIG TCL封装log4cpp出现未定义符号错误求助
解决SWIG封装log4cpp后TCL加载时的未定义符号错误
这个错误很明显是因为你在生成共享库的时候,没有链接log4cpp的核心库,导致运行时TCL加载.so文件找不到log4cpp内部的符号(比如_ZN7log4cpp8Appender29AppenderMapStorageInitializerD1Ev这类属于log4cpp库的内部符号)。
修复步骤:
- 修改链接阶段的命令,在
g++ -shared这一步加上-llog4cpp参数,告诉编译器要链接log4cpp库:g++ -shared log4cpp.o log4cpp_wrap.o -o log4cpp.so -llog4cpp - 如果log4cpp库安装在非标准路径(比如
/usr/local/lib),你可能需要额外指定库路径,用-L参数:g++ -shared log4cpp.o log4cpp_wrap.o -o log4cpp.so -L/usr/local/lib -llog4cpp - (可选)如果运行时还是提示找不到库,可以临时设置环境变量让系统找到log4cpp库:
或者在链接时加上export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH-Wl,-rpath=/usr/local/lib参数,把库路径嵌入到.so文件中:g++ -shared log4cpp.o log4cpp_wrap.o -o log4cpp.so -L/usr/local/lib -Wl,-rpath=/usr/local/lib -llog4cpp
为什么会出现这个问题?
你之前的编译命令只把自己的代码(log4cpp.o和log4cpp_wrap.o)打包成了共享库,但log4cpp的核心实现(比如Appender类的相关代码)在系统的liblog4cpp.so里,你的.so文件需要在链接阶段和这个库绑定,才能在运行时找到这些符号。
现在重新执行完整的编译流程:
swig -tcl -c++ log4cpp.i g++ -c -fPIC log4cpp.cpp log4cpp_wrap.cxx -I/usr/include/tcl8.5 g++ -shared log4cpp.o log4cpp_wrap.o -o log4cpp.so -llog4cpp
之后再在TCL里执行load ./log4cpp.so应该就能正常加载了。
内容的提问来源于stack exchange,提问作者Avi
相关产品推荐
相关产品推荐

