当前位置: 首页 > 面试题库 >

如何指定链接时要使用的库版本?

高运诚
2023-03-14
问题内容

后续问题应用程序在运行时如何解析为共享库的不同版本?,我想知道如何在链接命令行上指定要使用哪个版本的库?

假设我有

libmy.so.1.0
libmy.so.1    -> libmy.so.1.0
libmy.so.2.0
libmy.so.2    -> libmy.so.2.0
libmy.so      -> libmy.so.2

指定库与可执行文件链接的通常方法不会显示要使用的版本。此外,很可能要链接到最新版本。因此,通常的线路在大多数情况下都可以正常工作。

gcc app.o -lmy -o app

app使用该库的版本1 进行链接的命令行是什么?


问题答案:

链接器也可以接受文件名

gcc  app.o -l:libmy.so.1 -o app

来自man ld

-l namespec
--library = namespec
将namespec指定的归档文件或目标文件添加到要链接的文件列表中。此选项可以使用多次。
如果namespec的格式为:filename,则ld将在库路径中搜索名为filename的文件
,否则它将在库路径中搜索名为libnamespec.a的文件。


我注意到较旧的版本不支持它,因此请在系统上选中man ld -l--library选项。

您也可以链接到提及文件的全名

gcc  app.o /mylibpath/libmy.so.1 -o app


 类似资料:
  • 我在带有java 1.6的服务器上有一个与tomcat一起运行的war文件。我需要更新服务器上的java版本并让war文件使用java 1.7。当我重新启动tomcat时,这会自动发生吗,还是需要重新编译war文件? 我试图在我们的生产环境(1.7)中重现一个在我们的QA环境(1.6)中没有发生的错误。如果有兴趣,这里有个问题。

  • 问题内容: 当我在Ubuntu Lucid 10.04 PC上编译东西时,它会与glibc链接。Lucid使用glibc 2.11。当我在具有旧版glibc的另一台PC上运行此二进制文件时,该命令失败,提示没有glibc 2.11 … 据我所知,glibc使用符号版本控制。我可以强制gcc链接到特定的符号版本吗? 在我的具体用法中,我尝试为ARM编译gcc跨工具链。 问题答案: 您是正确的,因为g

  • 问题内容: 我正在编译一些在Debian Linux系统上使用libcurl的代码。我的开发机正在运行Debian 5,但我也希望二进制文件也可以在较旧的Debian 4系统上使用。 我发现如果指定 -lcurl ,它将链接到libcurl.so.4,但是Debian 4系统仅具有libcurl.so.3 有什么方法可以告诉GCC链接到libcurl.so.3(在Debian 4和5中都存在)还是

  • 问题内容: 我有一个与第三方供应商VENDOR1的库X版本libfoo静态链接的应用程序。它还与来自第三方供应商VENDOR2的动态(共享)库libbar链接,该库静态链接了VENDOR1的libfoo版本Y。 因此libbar.so包含libfoo.a的Y版本,而我的可执行文件包含libfoo.x的X版本。libbar仅在内部使用libfoo,并且没有从我的应用程序传递到libbar的libfo

  • 我正在尝试创建二维双链接圆形阵列,从txt文件读取数据并自动创建节点。我的程序正在正确地读取第一行,但当它到达下一行并开始创建下一个节点时,会出现空指针。我不明白为什么会这样,请帮帮我。 这些都是错误。Null指针在尝试创建第二个节点时发生。它正确地创建第一个节点,而不是紧接着创建空指针。 第77行=位置next=n; 第69行=插入后(head.prev, x); 第18行=mList。镶片(k

  • 在我的Gradle脚本中,我使用了一些库依赖项,比如 我现在想在应用程序中显示哪个版本的acutally是使用的。最简单的方法是使用保存版本信息。但是我怎么才能知道gradle下载的是哪一个版本。有没有办法在中确定这一点,或者我必须像这里描述的那样从路径中提取它?