我在 Linux 中创建了一个共享库(.so),我面临一个非常奇怪的问题。最初我在库中添加了 3 个函数(write_myown、setfolder、register),然后我又添加了一些函数(init、write_re)。
基本上整个库都是用 C++ 实现的,但是 API 需要从基于 C 和 C++ 的可执行文件中调用。因此,我为 API 使用了 extern "C"。
我面临的奇怪问题是,当我尝试使用函数 write_myown、setfolder 和 register 时,链接会通过并创建可执行文件。
但是当我尝试调用函数 init 或 write_re 时,链接失败,出现未定义的引用错误。
我认为但不确定的更奇怪的事情是,我想当我构建仅 C 的程序时它可以正常工作,但是当我构建基于 C++ 的代码时,就会看到这个问题。
我已经检查并确认了以下事项
- 库(.so)存在于 /usr/lib 中(我把它放在那里)
- ldconfig -p | grep mylibname 显示我的库存在。
- 当我不调用 init 或 write_re 时,会生成可执行文件,并且 objdump/readelf 会显示适当的引用。
- mylibrary.so 上的 ldd 显示 init 和 write_re 也存在,可见性是全局的。
- 创建的可执行文件或 .0 显示对 mylibrary 的正确依赖关系。
- 没有任何版本的 mylibrary。
- 我已经确认它引用了正确的.so。
- 我的库上的 nm 显示所有功能都存在。
知道我该如何解决这个问题吗?可能是什么问题。如果不是,我该如何进行调查。如果需要任何进一步的细节,请告诉我。
最好的问候, 帕万