2011-11-04 66 views
0

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

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

+0

你能明确地引用(从您的代码)这个初始化以某种方式? – trojanfoe

+0

这个想法是,这个库的用户可以通过简单地将它们链接到他们的应用程序来决定他们需要哪些模块。 – eile

+0

当然,但似乎并不奏效。 – trojanfoe

回答

2

你可以这样做:

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

这将打击libfoolibbar链接不管他们是否真正需要与否。

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

(我不知道你的设计是一个好主意,但。)

+0

谢谢,在我的CMakeLists.txt中添加了'设置(CMAKE_EXE_LINKER_FLAGS“-Wl, - 不需要)''解决了这个问题。 – eile

+0

重新设计:库有不同的模块来查询哪些GPU可用,例如AGL和GLX。每个都有自己的依赖关系。然后,应用程序可以选择使用哪一个,还有哪些其他DSO被吸入。您是否有如何更好地实现这一目标的建议? – eile

+0

一个带有'initFooBar(params)'方法的正常库,它在运行时加载相应的“真实”库,并执行所需的初始化。这是一种非常常见的“插件”方法。 – Mat