我已经看过stackoverflow中的所有答案:没办法。
我已经编译了一个使用Nite1.3的共享库A。所以我的图书馆在:
/usr/local/lib/A.so
我的项目B包括A。
编译B时,我得到了很多未定义的引用。.我怎样才能真正解决问题?
usr/local/lib/A.so: undefined reference to `XnVFlowRouter::XnVFlowRouter(char const*)'
.....
发生的情况是A.so不知道可以从libnite.so中获得nite符号,因此当它尝试解析符号时,它不知道要在该库中查找,并且环境中没有任何内容告诉它加载该库以查找符号。
两种解决方案:
(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)编译时链接到libnite.so B
,因此链接行应添加:
-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
选项)在哪里寻找该库。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句