我已经看过stackoverflow中的所有答案:没办法。
我编译了一个使用Nite1.3的共享库A.所以我的图书馆在:
/usr/local/lib/A.so
我的项目B包含A。
编译B,我得到了很多未定义的引用..我怎样才能真正解决问题?
usr/local/lib/A.so: undefined reference to `XnVFlowRouter::XnVFlowRouter(char const*)'
.....
答案 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
选项)查找库的位置。