首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIG tcl : log4cpp包装的未定义符号错误

SWIG tcl : log4cpp包装的未定义符号错误
EN

Stack Overflow用户
提问于 2018-01-10 18:21:33
回答 1查看 538关注 0票数 0

我是log4cpp和swig包装器的新手。我正在尝试使用log4cpp编写一个用于简单日志记录的接口。我已经在我的Ubuntu机器上安装了log4cpp和swig。

log4cpp.cpp:

代码语言:javascript
复制
#include "log4cpp/Category.hh"
#include "log4cpp/Appender.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/OstreamAppender.hh"
#include "log4cpp/Layout.hh"
#include "log4cpp/BasicLayout.hh"
#include "log4cpp/Priority.hh"
#include "log4cpp.h"

void writeLog() {
        log4cpp::Appender *appender1 = new log4cpp::OstreamAppender("console", &std::cout);
        appender1->setLayout(new log4cpp::BasicLayout());

        log4cpp::Appender *appender2 = new log4cpp::FileAppender("default", "program.log");
        appender2->setLayout(new log4cpp::BasicLayout());

        log4cpp::Category& root = log4cpp::Category::getRoot();
        root.setPriority(log4cpp::Priority::WARN);
        root.addAppender(appender1);

        log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
        sub1.addAppender(appender2);

        // use of functions for logging messages
        root.error("root error");
        root.info("root info");
        sub1.error("sub1 error");
        sub1.warn("sub1 warn");

        // printf-style for logging variables
        root.warn("%d + %d == %s ?", 1, 1, "two");

        // use of streams for logging messages
        root << log4cpp::Priority::ERROR << "Streamed root error";
        root << log4cpp::Priority::INFO << "Streamed root info";
        sub1 << log4cpp::Priority::ERROR << "Streamed sub1 error";
        sub1 << log4cpp::Priority::WARN << "Streamed sub1 warn";

        // or this way:
        root.errorStream() << "Another streamed error";
}

log4cpp.h:

代码语言:javascript
复制
void writeLog(void);

log4cpp.i:

代码语言:javascript
复制
%module log4cpp

%{
#include "log4cpp.h"
%}

%inline %{
extern void writeLog(void);
%}

我完成了以下步骤来生成log4cpp.so文件:

代码语言:javascript
复制
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

它生成的log4cpp_wrap.cxx, log4cpp.o, log4cpp_wrap.o and log4cpp.so文件没有任何警告和错误。

每当我在tcl中运行下面的命令时。

代码语言:javascript
复制
load ./log4cpp.so

它会生成一个未定义的符号错误:

代码语言:javascript
复制
% load ./log4cpp.so
couldn't load file "./log4cpp.so": ./log4cpp.so: undefined symbol: _ZN7log4cpp8Appender29AppenderMapStorageInitializerD1Ev

怎样做才能消除这个错误?

EN

回答 1

Stack Overflow用户

发布于 2018-01-11 15:56:34

您需要将SWIG共享库链接到log4cxx,就像使用此库的任何其他C++应用程序一样。所以当你调用

代码语言:javascript
复制
g++ -shared log4cpp.o log4cpp_wrap.o -o log4cpp.so

它真的需要像这样的东西(但要适应有真正的库和搜索路径)

代码语言:javascript
复制
g++ -shared log4cpp.o log4cpp_wrap.o -L/path/to/your/install/of/log4cxx -llog4cxx -o log4cpp.so 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48185147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档