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

Why does my .so have undefined symbols

我在 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 构建。

谢谢。

您可能应该 link 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

或者,您可以 link -ljansson 进入主程序(执行 dlopen)。你会比 link 使用 -rdynamic

的程序更好

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

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

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

进行优化