【问题标题】:gcc linker issuegcc 链接器问题
【发布时间】:2010-09-17 11:30:40
【问题描述】:

我正在尝试制作一个包装 libpurple 的库(您无需了解有关 libpurple 的任何信息即可在此处提供帮助)。 Libpurple 反过来加载“插件”,这些“插件”只是 .so 通过 dlopen 之类的东西访问。这些插件依次回调 libpurple 中的函数。

我可以很好地构建我的库,但是当它调用适当的 libpurple 初始化函数并且 libpurple 尝试加载插件时,我收到如下错误:

符号查找错误:/usr/local/lib/purple-2/autoaccept.so: undefined 符号:purple_user_dir

purple_user_dir 是 libpurple 中定义的函数。当我构建一个链接到 libpurple 的程序(不是库)时,没有问题。我试过使用 -export-dynamic ,但这似乎没有帮助。这是我的构建命令:

gcc -export-dynamic -I/usr/local/include/libpurple -I/usr/include/python2.5 -DH\
AVE_CONFIG_H -I. -DSTANDALONE -DBR_PTHREADS=0 -DDATADIR=\"/usr/local/share\" -D\
LIBDIR=\"/usr/local/lib/purple-2/\" -DLOCALEDIR=\"/usr/local/share/locale\" -DS\
YSCONFDIR=\"/usr/local/etc\" -Wall  -Waggregate-return -Wcast-align -Wdeclarati\
on-after-statement -Wendif-labels -Werror-implicit-function-declaration -Wextra\
 -Wno-sign-compare -Wno-unused-parameter -Winit-self -Wmissing-declarations -Wm\
issing-noreturn -Wmissing-prototypes -Wpointer-arith -Wundef -Wp,-D_FORTIFY_SOU\
RCE=2 -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -I/usr/inc\
lude/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/gl\
ib-2.0/include   -I/usr/include/libxml2   -g -g -O2 -c -o spurple.o spurple.c

gcc -shared -g -O2 -Wl,--export-dynamic -pthread 
../../libpurple/.libs/libpurple.so -o spurple.so spurple.o 
-Wl,--export-dynamic  /usr/local/lib/libpurple.so 
-ldbus-glib-1 -ldbus-1 /usr/lib/libgobject-2.0.so /usr/lib/libgmodule-2.0.so 
-ldl /usr/lib/libgthread-2.0.so -lrt /usr/lib/libglib-2.0.so 
/usr/lib/libxml2.so -lm -lpython2.5 -lutil -lpthread -lnsl -lresolv

谢谢。

【问题讨论】:

    标签: gcc build linker shared-libraries


    【解决方案1】:

    我会尝试使用lddnm unix 命令在包装器和包装库中查找符号。

    【讨论】:

    • 从使用 nm 来看,purple_user_dir 似乎是在 libpurple.so 中定义的,但不是在包装器 (spurple.so) 中。应该是这样吗? libpurple 中的其他一些符号在spurple.so 中定义,它看起来像我碰巧调用的函数,但不是purple_user_dir 例如。
    • 那么也许您需要在spurple.so 中“重新定义”它?
    • 有没有办法让 sparkple.so 自动从 libpurple 中提取所有符号,而无需我“重新定义”每个符号?
    【解决方案2】:

    只是在黑暗中拍摄,但是您在构建应用程序时的 LD_LIBRARY_PATH 环境变量是否与运行应用程序时不同?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      相关资源
      最近更新 更多