【问题标题】:From a C++ Library code to a C application code: symbol lookup error从 C++ 库代码到 C 应用程序代码:符号查找错误
【发布时间】:2017-07-10 16:22:47
【问题描述】:

我有一个 C++ 库和一些 C 应用程序代码。在C++库中,有一个对C应用函数的函数调用:

C++ 库中的源代码:

extern "C" {
  void foo();
}

...
void bar() { foo();}

在我的 C 代码中:

void foo() { 
 ...
}

还有这两个可执行文件的符号表:

readelf -sW C_application | grep foo

71: 0000000000400b10  1159 FUNC    GLOBAL DEFAULT   13 foo

readelf -sW libcpp_library.so | grep foo

11: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  foo

但是,当我像这样执行 C 应用程序时:

LD_PRELOAD="/home/asd/libcpp_library.so" ./C_application

我收到以下错误:

./C_application: symbol lookup error: /home/asd/libcpp_library.so : undefined symbol: foo

我不知道这里出了什么问题,那么任何人都可以阐明这个问题的潜在原因吗?

【问题讨论】:

  • 在某处有foo的定义吗?你给bar一个,这无关紧要。
  • @EugeneSh。是的,当然,foo 的定义在C 应用程序代码中。
  • 显示你的链接命令
  • 等待 - 库调用应用程序? "在C++库中,有一个对C应用函数的函数调用:"
  • 您是否尝试从库中调用可执行文件中的函数?那是行不通的。

标签: c++ c compilation linker runtime-error


【解决方案1】:

您需要导出您的函数才能从 .so 中使用/可见。 详细解释可以看这里:http://gcc.gnu.org/wiki/Visibility

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多