linux下动态库编译的依赖有关问题

linux下动态库编译的依赖问题
在使用动态库的时候遇见多动态库依赖的问题,烦请各位大大指点迷津。

原始问题:
  编写了一个ui.cpp,它会调用libsdk.so里面的函数sdk().但是libsdk.so中的sdk()函数,也会去调用libutopia.so里面的utopia()函数。所以依赖关系是ui.cpp->libsdk.so->libutopia.so.
    1.libutopia.so没有其它依赖,所以对于它是没有任何疑问。
    2.libsdk.so依赖于libutopi.so,所以Makefile是这样写的:g++ -fpic -shared sdk.o -L/home/wind/learn/test/utopia -o libsdk.so
    3.ui.cpp依赖于libsdk.so,所以Makefile是这样写的:g++ ui.o -L/home/wind/learn/test/sdk -lsdk -o ui.exe

PS:为了力求简洁,编obj的makefile 语句没有贴上来。我的LD_LIBRARY_PATH只包了/usr/lib和另外一个默认的路径。

现在ui路径下敲make去编ui.cpp,会出现如下错误:
g++ ui.o -L/home/wind/learn/test/sdk -lsdk -o ui.exe
/home/wind/learn/test/sdk/libsdk.so: undefined reference to `utopia()'
collect2: ld returned 1 exit status
make: *** [ui] 错误 1

=======>我有把libutopia.so拷到/usr/lib里面,那样编ui.cpp会没有问题。

疑问:
以上的现象给我造成了不少困惑:
一、在编libsdk.so的时候已经指明了libutopia.so的路径,明确的给出了libsdk.so的依赖关系,为什么在/usr/lib下没有libutopia.so的时候,会报错?这是表明编libsdk.so时候的依赖信息没有效,直接使用默认路径?

二、-L包动态库的路径,在link阶段的作用是什么,为生成可执行文件插入相关的信息吗?之所以会问这个问题,是因为我知道编译包的路径与动态运行(LD_LIBRARY_PATHA)的路径是不同的。

------解决思路----------------------
动态链接,编译的时候只是告诉它有这个符号,编译器认为会在程序运行时指定相应的实现,所以并不真正的链接它的实现,在编译完libsdk.so后,libsdk.so里面并没有这样的依赖信息。
在编译ui.exe的时候,没有告诉编译器utopia()的实现去哪里找,如果在系统默认的库目录里面都找不到,就报错。把libutopia.so放到系统默认的库目录里面,编译器可以找到它的实现。
-L和-l选项就是告诉编译器在编译的时候去指定目录下面在指定的库文件里面找想要的实现。
LD_LIBRARY_PATH是运行时的库路径的环境变量。