gpt4 book ai didi

c++ - 在 Linux 上链接到我自己的共享库中的某些函数时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:01 24 4
gpt4 key购买 nike

我在 Linux 中创建了一个共享库(.so),我面临一个非常奇怪的问题。最初我在库中添加了 3 个函数(write_myown、setfolder、register),然后我又添加了一些函数(init、write_re)。

基本上整个库都是用 C++ 实现的,但是需要从基于 C 和 C++ 的可执行文件调用 API。因此我对 API 使用了 extern "C"。

我面临的奇怪问题是,当我尝试使用这些功能时write_myown、setfolder 并注册,链接完成并创建可执行文件。

但是当我尝试调用函数 init 或 write_re 时,链接失败,并出现 undefined reference 错误。

我认为但不确定的更奇怪的事情是,我猜当我构建仅 C 的程序时它工作得很好,但是当我构建基于 C++ 的代码时,就会出现这个问题。

我已经检查并确认了以下事项

  1. 库(.so)存在于/usr/lib 中(我把它放在那里)
  2. ldconfig -p | ldconfig -p | ldconfig -p | ldconfig -p | ldconfig -p grep mylibname 显示我的库存在。
  3. 当我不调用 init 或 write_re 时,会生成可执行文件,并且 objdump/readelf 显示相应的引用。
  4. mylibrary.so 上的 ldd 显示 init 和 write_re 也存在,可见性是全局的。
  5. 创建的可执行文件或 .0 显示对 mylibrary 的正确依赖关系。
  6. mylibrary 没有版本。
  7. 我已确认它引用了正确的 .so。
  8. 我的库中的 nm 显示所有功能都存在。

知道如何解决这个问题吗?以及可能是什么问题。如果不是,我如何继续调查。如果需要任何进一步的详细信息,请告诉我。

最诚挚的问候,帕万

最佳答案

The strange issue i am facing is that when i try to use the functions write_myown, setfolder and register, the linking goes thru and executable is created.

But when i try to call functions init or write_re the linking fails, with undefined reference error.

我的 Crystal 球说:当您在 .h 文件中编写 write_myownsetfolder 原型(prototype)时,您已向其中添加了 extern "C"

但是当您后来添加 write_re 时,您将 extern "C" 放在 .cc 文件中的定义上,但忽略了将其添加到 .h 中的原型(prototype)中。

如果是这样,

  • 函数在库中以未损坏的形式定义,并且
  • C 可执行文件可以很好地使用它们,并且
  • 引用它们的 C++ 对象(在库之外)看不到它们上的 extern "C",因此需要它们的损坏形式(当然由库提供)。

我认为这个假设符合您问题中当前的所有事实,并且验证起来很简单:来自链接器的错误消息是说 undefined symbol :write_re,还是说 undefined symbol :write_re(some,参数,类型)

如果是后者,那就完全暴露了某个对象正在引用损坏的名称。

关于c++ - 在 Linux 上链接到我自己的共享库中的某些函数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14722434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com