2013-01-01 41 views
1

我正在制作一个使用大量自己的共享库的项目;我的目的是在目录中创建一个库名,例如,而不是-lfoo(要找到/usr/lib/libfoo.so或/opt/lib/libfoo.so或左右),我会使用-lfoo/bar(找到/usr/lib/libfoo/bar.so或/opt/lib/libfoo/bar.so等)。名称上带有路径的共享库

我做了一个真正的小代码进行测试:

const char *mylib(void) { 
    return "it woooorks! =D"; 
}; 

并编译它:gcc -fPIC -shared -Wl,-rpath,libfoo/ lib.c -o /usr/lib/libfoo/bar.so

然后,在测试程序中,我使用gcc -lfoo/bar test.c,并将其编译(它发现从我的库中的mylib()符号),但是当我尝试运行程序(./a.out),动态连接器抱怨说,它不能找到图书馆。在我的情况下,使用Mac OS X Lion的:

dyld: Library not loaded: bar.so 
    Referenced from: /Users/takanuva/tmp/lib/./a.out 
    Reason: image not found 
Trace/BPT trap: 5 



我在做什么错?也许答案是“一切”,所以...我应该如何实现所需的效果,在库路径上查找libfoo/bar.so而不是libfoo.so?

在此先感谢。 :)

回答

0

如果库没有位于标准路径(和/ opt是通常不搜索这样的路径),你必须指定-L/-rpath的路径,如gcc blah.c -L/opt/whatever -Wl,-rpath,/opt/whatever -lbar。不要试图在-l参数中使用路径分隔符。

+0

这个想法是有一个相对于标准搜索路径的路径,所以它可以查找/usr/lib/whatever/test.so,/usr/local/lib/whatever/test.so,/ opt/lib /whatever/test.so等等。 – paulotorrens