如何从共享库中解决未定义的引用?

时间:2013-12-02 15:30:25

标签: linux eclipse g++ shared-libraries undefined-reference

我已经看过stackoverflow中的所有答案:没办法。

我编译了一个使用Nite1.3的共享库A.所以我的图书馆在:

 /usr/local/lib/A.so

我的项目B包含A。

编译B,我得到了很多未定义的引用..我怎样才能真正解决问题?

usr/local/lib/A.so: undefined reference to `XnVFlowRouter::XnVFlowRouter(char const*)'
.....

1 个答案:

答案 0 :(得分:2)

发生的事情是A.so不知道nite符号可以从libnite.so获得,所以当它试图解析符号时它不知道要查看那个库,而环境中什么都没有告诉它加载该库以寻找符号。

两种解决方案:

(1)重新编译A.so并明确依赖于Nite 1.3,因此在编译时你会这样做:

g++ -o A.so <files making up A.so> -L<DIRECTORY OF NITE> -Wl,-rpath <DIRECTORY OF NITE> -lnite

如果libnite.so位于其中一个标准位置,那么您应该可以省略-L-Wl,-rpath选项。这将使您的库明显依赖于libnite。

(2)在编译B时链接到libnite.so,所以链接行应该添加:

-L<DIRECTORY OF NITE> -Wl,-rpath <DIRECTORY OF NITE> -lnite

作为附录,如果您有.h个文件,但没有相应的.a.so用于实施,那么您需要先解决该问题能够使用A.so

例如,如果libnite.so位于/usr/local/lib,那么您需要添加:

-L/usr/local/lib -Wl,-rpath /usr/local/lib -lnite

到编译行,以便它知道在编译时(-L选项)和运行时(-Wl,-rpath选项)查找库的位置。