符号存在于.so中,编译.o引用它但链接失败

时间:2017-01-04 20:11:00

标签: c++ static linker

我有一个奇怪的问题,将c ++与Leptonica联系起来。普通函数调用工作正常,但我需要库中最初未在.so库中公开的函数。所以我在源代码中搜索了两个有趣的函数,删除了 static 关键字,因此它们看起来与暴露的类似。在make clean之后我重新制作了完整的库。 .so文件看起来没问题:

nm liblept.so.5.0.0
...
000000000009d010 T dewarpGetMeanVerticals
000000000009d160 T dewarpGetTextlineCenters
000000000009d8f0 T dewarpIsLineCoverageValid

编译成.o文件并观察它:

g++ -c -std=c++11 -I../leptonica/src/src/ preproc.cpp -L../leptonica/src/.libs/ -llept -o preproc
nm preproc
...
U dewarpGetMeanVerticals
U dewarpIsLineCoverageValid

虽然没有-c标志的相同编译导致

/tmp/ccCPqS1R.o: In function `_dewarpGetTextlineCenters(Pix*, int)':
preproc.cpp:(.text+0x3d5): undefined reference to `dewarpGetMeanVerticals'
/tmp/ccCPqS1R.o: In function `_dewarpBuildPageModel(L_Dewarp*, char const*)':
preproc.cpp:(.text+0x81d): undefined reference to `dewarpIsLineCoverageValid'
collect2: error: ld returned 1 exit status

我做错了什么?

提前感谢:Balázs

1 个答案:

答案 0 :(得分:0)

我想你可能需要extern" C"如果你想在这些函数中公开它们,那么围绕这些函数的关键字。由于名字似乎不会被.so中的C ++编译器破坏,所以情况可能并非如此。

我注意到您向我们展示了liblept.so.5.0.0中的内容以及与liblept.so相关联的信息。您是否可能需要更新符号链接以便链接到正确的.so文件?