构建可执行文件时涉及.so库时对错误的未定义引用

问题描述 投票:1回答:2

我有一个.so库,在构建它时,我没有收到任何未定义的参考错误。但是现在我正在使用.so文件构建可执行文件,并且在链接阶段可以看到未定义的引用错误,如下所示:

xy.so:对“ MICRO_TO_NANO_ULL”的未定义引用

我指的是thisthis,但实际上无法理解动态链接。

也从here中读取会导致更多的混乱:

动态链接是通过放置共享名称来实现的可执行映像中的库。与图书馆的实际联系只有在运行映像时,可执行文件和库都放在内存中。的优势动态链接是多个程序可以共享一个图书馆。

我的问题是:

  • 不是动态链接意味着当我使用如果链接器找不到./executable_name,则显示.so文件取决于哪个可执行文件应该崩溃?

  • 如果所有外部实体引用均是动态链接,则实际上是什么在建设时解决了?它是由动态链接程序执行的某种预检查吗?其他动态链接器可以利用LD_LIBRARY_PATH获取其他库来解决未定义的问题符号。

c gcc ld dynamic-linking .so
2个回答
0
投票

不是动态链接意味着当我使用./executable_name启动可执行文件时,如果链接程序无法找到依赖于它的可执行文件的.so文件,则会崩溃吗?

是。如果运行时.so文件不存在。

如果在构建时解决了所有外部实体引用,动态链接实际上是什么?它是由动态链接程序执行的某种预检查吗?其他动态链接程序可以利用LD_LIBRARY_PATH获取其他库来解析未定义的符号。

[它允许升级库并使应用程序仍然能够使用该库,并且它通过加载库的一个副本而不是在每个使用库的应用程序中加载一个副本来减少内存使用。

如果链接器不需要链接符号,则动态链接器只会在运行时失败,这没有意义,因为软件无法正确构建且无法正确运行。

动态链接程序不会提取任何库,除非在可执行文件中指定了这些库(或者通过扩展指定了可执行文件所依赖的任何库)。如果为LD_LIBRARY_PATH提供的库的版本与可执行文件要求的版本完全不同,则可执行文件可能会崩溃。


0
投票

[似乎在编译共享库时缺少#define。此错误

xy.so:对“ MICRO_TO_NANO_ULL”的未定义引用

意味着,类似

#define MICRO_TO_NANO_ULL(sec) ((unsigned long long)sec * 1000)

应该存在,但不存在。

然后编译器假定它是一个外部函数,并为其创建一个(未定义的)符号,而应在编译时通过预处理器宏对其进行解析。

如果您包含正确的文件(宏名称的grep)或在源文件的顶部放置适当的定义,则链接器错误应消失。

© www.soinside.com 2019 - 2024. All rights reserved.