【问题标题】:ld ignores librariesld 忽略库
【发布时间】:2011-12-21 21:27:37
【问题描述】:

Ubuntu 11.10 中的链接器似乎会忽略我在链接行中指定的库,如果它们不包含链接应用程序使用的任何符号:

Linking CXX executable ../../bin/gpu_sd_list
cd /home/eile/Software/gpu-sd/debug/apps/gpu_sd_list && /usr/bin/cmake -E cmake_link_script CMakeFiles/gpu_sd_list.dir/link.txt --verbose=1
/usr/bin/c++    -Wall -Wextra -Winvalid-pch -Wnon-virtual-dtor -Wsign-promo -Wshadow -Winit-self -Wno-unknown-pragmas -Wno-unused-parameter -Wno-write-strings -Werror -g    CMakeFiles/gpu_sd_list.dir/gpu_sd_list.cpp.o  -o ../../bin/gpu_sd_list -rdynamic ../../lib/libgpusd_remote_dns_sd.so.1.0.0 -ldns_sd ../../lib/libgpusd_remote.so.1.0.0 -Wl,-rpath,/home/eile/Software/gpu-sd/debug/lib: 

ldd ./debug/bin/gpu_sd_list
linux-vdso.so.1 =>  (0x00007fff0a5c6000)
libgpusd_remote.so.1 => /home/eile/Software/gpu-sd/debug/lib/libgpusd_remote.so.1 (0x00007ff9a21fc000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff9a1ece000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff9a1cb7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff9a1918000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff9a1694000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff9a2406000)

libgpusd_remote_dns_sd.so.1.0.0 丢失。这适用于 Ubuntu 11.04。该库包含一个使用 gpusd_remote 库注册模块的静态初始化程序。如果在程序启动时未加载,则缺少功能。完整来源在https://github.com/Eyescale/gpu-sd

【问题讨论】:

  • 你能以某种方式显式引用(从你的代码中)这个初始化器吗?
  • 这个想法是这个库的用户可以通过简单地将它们链接到他们的应用程序来决定他们需要哪些模块。
  • 当然,但这似乎不起作用。

标签: linux ubuntu shared-libraries ld


【解决方案1】:

你可以这样做:

.... -Wl,-no-as-needed -lfoo -lbar -Wl,-as-needed

这将链接到libfoolibbar,无论它们是否实际需要。

as-needed 是某些发行版的默认设置,因为它在大多数情况下都有意义。

(不过我不确定你的设计是否是个好主意。)

【讨论】:

  • 谢谢,在我的 CMakeLists.txt 中添加 'set(CMAKE_EXE_LINKER_FLAGS "-Wl,--no-as-needed")' 解决了这个问题。
  • 重新设计:库有不同的模块来查询哪些 GPU 可用,例如 AGL 和 GLX。每个都有自己的依赖项。然后,应用程序可以选择使用哪一个,以及吸入哪些其他 DSO。您对如何更好地实现这一点有什么建议吗?
  • 具有initFooBar(params) 方法的普通库,可在运行时加载适当的“真实”库并执行所需的任何初始化。这是一种很常见的“插件”方法。
  • 当然,这需要基础库事先了解所有插件。我会考虑的 - 谢谢。
  • 它没有。基本库可以处理配置文件和/或环境。例如 vars。
猜你喜欢
  • 2018-03-24
  • 2018-10-23
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多