如何在CFFI创建的共享库中修复“未定义符号”?

问题描述 投票:0回答:1
我编写了一个C程序,以使用GStreamer和GTK窗口显示内存映射的视频文件。目的是使用CFFI构建一个共享库,我可以从Python调用它。当我尝试导入库时,收到一条消息,报告未定义的符号。

我使用一个只包含一个小程序的库重新创建了一个问题:

#include <gtk/gtk.h> #include "test_cdef.h" int main (int argc, char *argv[]) { return test(); } int test() { GtkWidget *main_window; gtk_init (NULL, NULL); main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(main_window), "Test"); gtk_window_set_default_size(GTK_WINDOW(main_window), 1600, 900); gtk_widget_show_all(main_window); g_main_loop_run (g_main_loop_new (NULL, TRUE)); return 0; }

[当我尝试导入库时,收到以下消息:

ImportError: [library file name]: undefined symbol: gtk_window_get_type

经过大量搜索之后,似乎最接近我的问题已通过更改编译器/链接选项得以解决。我用gcc构建程序。我认为CFFI使用相同的库来构建库。

如果应该更改这些选项,我将有两个问题:(1)应该使用哪些选项,以及(2)如何将这些选项传达给CFFI?对于上述两个问题的帮助,我们将不胜感激。

我的操作系统是Linux Mint 19.3。其他软件包是GTK-3.0,python 3.6.9,python3-cffi 1.11.5-1。

任何帮助将不胜感激。

python shared-libraries linker
1个回答
0
投票
我找到了解决方案。确实,这是两个不同级别的链接问题:用于构建静态库的链接和用于构建链接至静态库的共享库的链接。

对我来说,突破是当我终于能够找到定义第一个报告的符号问题的GTK库的名称时。我将该库名称添加到我的makefile中命令的gcc链接部分。有了这一附加功能,链接器就足以按名称报告另一个丢失的库(尽管错误消息有点含糊)将其称为丢失的DSO(动态共享对象)。为什么设计人员没有写链接器来报告遗漏并自动添加缺少的库,这是另一天的话题。逐个添加丢失的库,我最终能够构建一个没有错误的静态库。

[使用CFFI,缺少的库在[libraries]列表中指定,而它们的公共目录(我的系统上的/ usr / lib / x86_64-linix-gnu)在[library-dirs]列表中指定。共享库的构建遇到了另外一些缺少的库,我最终通过搜索包含缺少的符号的文本字符串的库文件找到了。

© www.soinside.com 2019 - 2024. All rights reserved.