我使用一个只包含一个小程序的库重新创建了一个问题:
#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。
任何帮助将不胜感激。
对我来说,突破是当我终于能够找到定义第一个报告的符号问题的GTK库的名称时。我将该库名称添加到我的makefile中命令的gcc链接部分。有了这一附加功能,链接器就足以按名称报告另一个丢失的库(尽管错误消息有点含糊)将其称为丢失的DSO(动态共享对象)。为什么设计人员没有写链接器来报告遗漏并自动添加缺少的库,这是另一天的话题。逐个添加丢失的库,我最终能够构建一个没有错误的静态库。
[使用CFFI,缺少的库在[libraries]列表中指定,而它们的公共目录(我的系统上的/ usr / lib / x86_64-linix-gnu)在[library-dirs]列表中指定。共享库的构建遇到了另外一些缺少的库,我最终通过搜索包含缺少的符号的文本字符串的库文件找到了。