2014-08-29 134 views
2

我想將我的程序鏈接到libGL.so庫,但我的可執行文件也以libnvidia-tls.so.331.62和libnvidia-glcore.so.331.62引用結束。即使NVidia驅動程序將被要求執行我的程序(我使用CUDA),但我不希望它依賴於特定版本的庫(驅動程序)。鏈接到libGL添加引用NVidia庫

這是一個簡單的例子;源:

#include <GL/glew.h> 

int main(int argc, char** argv) { 
    glBegin(GL_LINES); 
    glEnd(); 

    return 0; 
} 

我建立程序以:

輸出 ldd main
g++ -o main main.cpp -lGL 

linux-vdso.so.1 => (0x00007fff6c3fc000) 
libGL.so.1 => /usr/lib/nvidia-331/libGL.so.1 (0x00007fd4f37c5000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd4f33fd000) 
libnvidia-tls.so.331.62 => /usr/lib/nvidia-331/tls/libnvidia-tls.so.331.62 (0x00007fd4f31f9000) 
libnvidia-glcore.so.331.62 => /usr/lib/nvidia-331/libnvidia-glcore.so.331.62 (0x00007fd4f09ea000) 
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fd4f06b5000) 
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fd4f04a2000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd4f029e000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fd4f3b21000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd4eff9a000) 
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fd4efd7b000) 
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fd4efb77000) 
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fd4ef971000) 

(注意引用libnvidia-TLS和libnvidia-glcore)。

如果我用g++ -o main main.cpp /usr/lib/x86_64-linux-gnu/libGL.so進行編譯,我會得到相同的結果。

ldd /usr/lib/x86_64-linux-gnu/libGL.so輸出:

linux-vdso.so.1 => (0x00007fff4d5d8000) 
libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007fa63dfd5000) 
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fa63ddc3000) 
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007fa63dbbf000) 
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007fa63d9b9000) 
libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007fa63d7b7000) 
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fa63d481000) 
libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007fa63d26a000) 
libxcb-dri2.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0 (0x00007fa63d065000) 
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fa63ce46000) 
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007fa63cc40000) 
libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007fa63ca34000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa63c816000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa63c612000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa63c24a000) 
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fa63c045000) 
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fa63be3f000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fa63e482000) 

請注意,有任何關於這裏的NVIDIA庫。

編輯:的readelf -d main | grep NEEDED輸出:

0x0000000000000001 (NEEDED)    Shared library: [libGL.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 

任何想法?謝謝 !

+0

'readelf -d t main | grep需要? ( – 2014-08-29 02:20:12

+0

我將它添加到問題:-) – personne3000 2014-08-29 02:23:29

回答

4

ldd命令不會執行您認爲的操作。

ldd命令可顯示程序或庫具有的所有庫依賴項,包括直接和間接庫。所以它會顯示您直接使用的libGL.so.1,以及您間接使用的libnvidia-tls.so.331.62

readelf -d命令將僅顯示您的程序直接使用的庫:libGL.so.1libc.so.6

換句話說,libnvidia-tls.so.331.62的引用不在您的程序中。它在你的程序使用的庫中。如果您將程序移至其他系統,則可能會看到另一個庫。

+0

這意味着我的程序很可能已經與使用不同版本的nvidia驅動程序的系統兼容,並且我實際上沒有任何問題?謝謝 ! (注意:我認爲你的意思是readelf -d -t,使用readelf -dt給我「t:沒有這樣的文件」) – personne3000 2014-08-29 02:37:34

+0

@ personne3000:不,'readelf -dt ' – 2014-08-29 03:01:11

+0

「readelf -dt main」give me「readelf :錯誤:'t':沒有這樣的文件「,然後是」File:main「,後面跟readelf相同的結果-d main – personne3000 2014-08-29 04:14:38