无法编译LibOTR

时间:2015-02-01 17:49:05

标签: c++ c symbols name-mangling libotr

我正在尝试使用libotr,但在尝试编译非常基本的库初始化时遇到以下问题。

#include <libotr/proto.h>

int main(int argc, char const *argv[])
{
  OTRL_INIT;
  // OtrlUserState userstate = otrl_userstate_create();

  return 0;
}

我正在使用以下命令编译它:

g++ main.cpp -o main -L /usr/local/lib/ -lotr

但由于某种原因,我得到了:

Undefined symbols for architecture x86_64:
  "otrl_init(unsigned int, unsigned int, unsigned int)", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [bin/bin] Error 1

我明确检查过,库确实有以下符号。

1 个答案:

答案 0 :(得分:2)

经过快速观察后,我注意到libotr正在使用C类型名称修改,只需将以下行添加到库的include子句中即可解决问题:

extern "C" {
  #include <libotr/proto.h>
}

如果您遇到类似问题,只需使用nm实用程序列出库的符号,并检查符号名称是以一个或两个下划线开头:_fooC样式,而__fooC++样式。

P.S。我发布了这个,因为我花了一段时间来弄明白。我希望这个问题+答案可以节省你一些时间。