Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 共享对象的实际用途_C_Linux_Shared - Fatal编程技术网

C 共享对象的实际用途

C 共享对象的实际用途,c,linux,shared,C,Linux,Shared,共享对象(.so)文件的实际用例是什么 据我所知,它用于与其他高级语言(如JAVA(JNI)等)链接。它还用于为各种操作系统风格/处理器体系结构创建库文件 如何使用此功能 例如,如果我想创建一个通用的可执行文件,并且需要在所有版本的Linux操作系统中工作,那么可以使用共享对象文件吗?如何实现?要使用共享对象,首先需要创建一个共享库。它也称为动态库 共享库用于动态运行时链接。这意味着在程序运行时,这些共享库被加载到RAM中 用于创建动态库或共享库的命令- cc -shared -o libany

共享对象(.so)文件的实际用例是什么

据我所知,它用于与其他高级语言(如JAVA(JNI)等)链接。它还用于为各种操作系统风格/处理器体系结构创建库文件

如何使用此功能


例如,如果我想创建一个通用的可执行文件,并且需要在所有版本的Linux操作系统中工作,那么可以使用共享对象文件吗?如何实现?

要使用共享对象,首先需要创建一个共享库。它也称为动态库

共享库用于动态运行时链接。这意味着在程序运行时,这些共享库被加载到RAM中

用于创建动态库或共享库的命令-

cc -shared -o libany_name.so file1.o file2.o file3.o
其中
any_name
name表示您可以为库指定任何名称。对于libadd.so

您可以通过以下方式使用共享库执行程序:-

cc filename.c libany_name.so
创建可执行文件时-

cc filename.c 
cc -static filename.c

它将创建一个动态可执行文件。这些动态可执行文件在运行时需要一些依赖文件。这些依赖项文件由编译器自动加载到

要避免这种情况,请使用静态库或静态可执行文件。静态可执行文件包含所有函数本身。可执行文件的大小将更大

创建静态库的命令-

ar rcs libany_name.a file1.o file2.o file3.o
用于创建静态可执行文件的命令-

cc filename.c 
cc -static filename.c
作为补充,共享对象通常有一些共享文本段(除了一些私有的、非共享的文本段),这些文本段在使用
MAP\u shared
时被定义。一个典型的Linux系统有数百个文件(例如
/usr/lib/lib*.so
文件),因此它们可能共享一些公共RAM(使用同一个库的两个不同进程通常会共享其文本段的RAM),并且更新它们很容易(如果您更新了一些
lib*.so
链接到它的程序的未来运行将使用更新的版本)

还可以在运行时使用动态加载共享对象(然后使用
dlsym
在其中获取一些符号)。这就是加载方式。加载应用程序必须定义并记录一些约定,例如插件中要找到的符号的要求以及如何使用这些符号

一个很好的参考是;另请参见和


您的一般可执行目标可能是一种幻觉。首先,不同的Linux系统运行在不同的处理器或(x86 32位、x86-64、ARM)上。然后,即使仅限于x86-64 Linux,不同的发行版也有您的可执行文件所需的和的其他库的不同版本


最简单的方法是制作您的程序(因此发布其源代码);然后由发行商进行打包。此外,如果您将软件打包为通用发行版,也会有所帮助。

在这里,您可以阅读有关此主题的许多有用信息。。