为什么我的 .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
进行优化
我在 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