Tag: 共享库

如何创建nautilus C扩展

我正在尝试在C中创建Nautilus扩展,但只有Python示例和帮助。 几乎没有文档和字面上没有示例,但只是一些完整的扩展,这些扩展很长,很难为初学者理解。 我只需要一个简单的示例代码,在Nautilus的列表视图中创建一个新列。 如何编写和编译它。 我试过的代码是: #include typedef struct _FooExtension FooExtension; typedef struct _FooExtensionClass FooExtensionClass; struct _FooExtension { GObject parent_slot; }; struct _FooExtensionClass { GObjectClass parent_slot; }; static void foo_extension_class_init (FooExtensionClass *class); static void foo_extension_instance_init (FooExtension *img); static void foo_extension_class_init(FooExtensionClass *class) { } static void foo_extension_instance_init(FooExtension *img) { } static GType provider_types[1]; static GType foo_extension_type; static […]

-symbolic和-shared GCC标志之间有什么区别?

从文档的描述中,他们似乎做了同样的事情,除了“并非所有系统”支持共享和“只有一些系统”支持符号(不清楚这些是否是同一组系统): -shared生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件。 并非所有系统都支持此选项。 对于可预测的结果,还必须指定在指定此选项时用于生成代码(-fpic,-fPIC或模型子选项)的同一组选项。[1] -symbolic在构建共享对象时绑定对全局符号的引用。 警告任何未解析的引用(除非被链接编辑器选项-Xlinker -z -Xlinker defs覆盖)。 只有少数系统支持此选项。 我怀疑区别在于“生成一个共享对象,然后可以与其他对象链接以形成可执行文件”部分,但这听起来像任何库都是如此。 这是否意味着生成的共享对象也可以静态链接?

.o .a和.so文件有什么区别?

我知道.o是目标文件,.a是静态库,.so是动态库吗? 它们的物理意义是什么? 我何时可以使用,何时不使用?

将共享库编译成程序?

我写了一个程序,它使用我系统上安装的共享库。 该库很少安装在其他系统上。 如何编译我的程序,以便不需要在其他系统上安装库? 我有可用的库的源代码。 什么是最好的方式? 其他系统当然具有相同的架构和操作系统。

gcc在静态库中链接未解析符号的顺序是什么

当调试函数符号冲突问题时,我发现gcc的一个奇怪的行为我无法理解,通过以下示例代码说明: main.c中 #include int main() { b(); a(); } AC #include void a(void) { printf(“func a in a\n”); } 公元前 #include void a() { printf(“func a in b\n”); } void b() { printf( “func b try to call a \n”); a(); } 编译: gcc -c ac gcc -c bc ar -cr liba.a ao ar -cr […]

gcc` -shared`选项如何影响输出?

从技术上讲,就文件内容而言, gcc -fPIC -shared src.c和gcc -fPIC src.c的输出有什么区别? 假设在src.c定义了int main(int, char**) ,以便两个编译都成功。 但是按预期执行gcc -shared src.c生成的a.out会出现以下错误: -bash: ./a_shared.out: cannot execute binary file 即使它有一个mainfunction。 另外,如何使用otool或objdump等工具检查输出文件的差异? 非常感谢。

FreeType库和“对FT_Init_FreeType的未定义引用”

来自PHP,这是我第一次使用C / C ++(对我来说很容易)。 我正在按照本教程使用FreeType库编写一个简单的脚本。 以下编译就好了: #include #include FT_FREETYPE_H main() { FT_Library library; FT_Face face; } 这告诉我FreeType库随时可供编译器使用。 但是,一旦我尝试使用任何方法,事情就会中断。 例如,采用以下脚本: #include #include FT_FREETYPE_H main() { int error; FT_Library library; error = FT_Init_FreeType(&library); if (error) {} FT_Face face; error = FT_New_Face(library, “/usr/share/fonts/truetype/arial.ttf”, 0, &face); if (error == FT_Err_Unknown_File_Format) { printf(“Font format is unsupported”); } else if (error) […]

可执行的共享库

大多数情况下,当您编译共享库时,执行它是没有意义的,这样做没有任何用处: $ ./libfoobarbaz.so Segmentation fault 但是,当执行glibc时,GNU的人们能够坚持一些输出: $ /lib/libc.so.6 GNU C Library (Debian EGLIBC 2.11.2-10) stable release version 2.11.2, by Roland McGrath et al. Copyright (C) 2009 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiled […]

如何从静态库创建共享对象文件

如何从静态库创建共享对象文件? 我正在使用Cygwin。 以下语法是否正确? gcc -shared -o libexample.so libexample.a

返回共享库符号表

例如: void* sdl_library = dlopen(“libSDL.so”, RTLD_LAZY); void* initializer = dlsym(sdl_library,”SDL_Init”); 假设没有错误,初始化程序将指向共享库libSDK.so中的函数SD_Init。 但是,这需要知道符号“SDL_Init”存在。 是否可能在库中查询其所有符号? 例如,在这种情况下,它将返回SDL_Init,函数指针以及libSDL.so导出的任何其他符号。