Linux链接共享对象

时间:2013-06-14 07:40:10

标签: c linux gcc ld

我正在链接一个,这取决于libmxml.so。但是我没有权限安装libmxml.so。

这就是我在做什么

gcc -shared -m32 -o ServiceProvider.so ServiceProvider.o -L ../../../../system/addonlibs/ -lmxml -lpthread

ldd告诉我

ldd ServiceProvider.so 
    libmxml.so.1 => not found
    libpthread.so.0 => /lib/libpthread.so.0 (0x40026000)
    libc.so.6 => /lib/libc.so.6 (0x40046000)

第二次尝试是

gcc -shared -m32 -o ServiceProvider.so ServiceProvider.o ../../../../system/addonlibs/libmxml.so -lpthread

仍然ldd告诉我

ldd ServiceProvider.so 
    libmxml.so.1 => not found
    libpthread.so.0 => /lib/libpthread.so.0 (0x40026000)
    libc.so.6 => /lib/libc.so.6 (0x40046000)

因此,ldd找不到库,因为我只有“libmxml.so”,但没有“libmxml.so.1”。如何摆脱这个“.1”后缀?为什么会这样?

1 个答案:

答案 0 :(得分:0)

当您与动态库链接时,您不应该这样做:

gcc -shared -m32 -o ServiceProvider.so ServiceProvider.o ../../../../system/addonlibs/libmxml.so -lpthread

相反,请确保/yourpath/system/addonlibs({1}}(您应该使用完整路径而不是相对路径)在LIBRARY_PATH中。然后改变你的链接命令。

export LIBRARY_PATH=/yourpath/system/addonlibs:$LIBRARY_PATH
gcc -shared -m32 -o ServiceProvider.so ServiceProvider.o -lmxml -lpthread

您也可以写下:

gcc -shared -m32 -o ServiceProvider.so ServiceProvider.o -L/yourpath/system/addonlibs -lmxml -lpthread

但是,要运行程序,您需要在LD_LIBRARY_PATH

中设置库路径

如果您遇到.so.so.1内容的问题,请将您的.so重命名为.so.1并制作符号链接.so.1.so

修改

如果您执行objdump -p libmxml.so | grep SONAME,您可能会获得libmxml.so.1。 这是您获得libmxml.so.1标识符的地方。