为什么我的.so有未定义的符号

时间:2015-02-26 17:38:51

标签: c dll linker shared-libraries dlopen

我在linux中创建一个运行时加载的共享对象,它使用jannson.h来实现一些JSON。

这就是我正在构建.so:

的方式
gcc -Wall -fPIC -c device_simulator_json.c

gcc -shared -Wl,-soname,device_simulator_json.so.1 -o device_simulator_json.so.1.0 device_simulator_json.o

当我的应用程序尝试加载.so时,我收到错误指示:     未定义的符号:json_object

我猜我的.so必须包含jansson对象。但我不确定是哪一个或如何。我可以在/ usr / local / lib中看到以下jansson对象:

./usr/local/lib/libjansson.so.4.7.0
./usr/local/lib/libjansson.so.4
./usr/local/lib/libjansson.a
./usr/local/lib/libjansson.so

因为.so我的构建是在运行时动态加载的(使用dlopen),所以我使用的jansson对象也不必使用PIC构建。

感谢。

1 个答案:

答案 0 :(得分:1)

您可能应该在共享库中链接libjansson.so

gcc -L/usr/local/lib -shared -Wl,-soname,device_simulator_json.so.1 \
  -o device_simulator_json.so.1.0 device_simulator_json.o  -ljansson

或者,您可以将-ljansson链接到主程序(执行dlopen)。然后,您最好将该程序与-rdynamic

相关联 顺便说一句,您可能应该使用所有警告和调试信息编译您的共享对象:

 gcc -Wall -Wextra -g -fPIC -c device_simulator_json.c

调试完所有内容后,您可以使用-O2

进行优化