gcc编译与链接

gcc编译与链接,c,gcc,shared-libraries,C,Gcc,Shared Libraries,我用这种方式创建了一个共享库 gcc -I/home/lib 'pkg-config --cflags gtk+-2.0 libxml-2.0' -shared -fPIC -Wl,--export-dynamic file1.c file2.c -o lib.so 它可以工作,创建的库也可以满足我的需要。 我想知道的是编译和链接在这个命令字符串中的位置,所以请向我解释一下,并告诉我一种将它们划分为两个不同命令的方法,以便更好地理解。 我需要理解这一点,因为我无法解释为什么这个库可以工作,即使

我用这种方式创建了一个共享库

gcc -I/home/lib 'pkg-config --cflags gtk+-2.0 libxml-2.0' -shared -fPIC -Wl,--export-dynamic file1.c file2.c -o lib.so
它可以工作,创建的库也可以满足我的需要。 我想知道的是编译和链接在这个命令字符串中的位置,所以请向我解释一下,并告诉我一种将它们划分为两个不同命令的方法,以便更好地理解。
我需要理解这一点,因为我无法解释为什么这个库可以工作,即使它必须链接到另一个我从未链接过的库。

gcc-c选项仅用于编译。但是,我不确定这是否是您想要的。

gcc-c选项仅用于编译。但是,我不确定这是否是您想要的。

您的命令在一次调用中编译和链接

可以将命令拆分为编译命令和链接命令:

gcc -c -o file1.o -Wall -Wextra -Werror -I/home/lib $(pkg-config --cflags gtk+-2.0 libxml-2.0) -fPIC file1.c
gcc -c -o file2.o -Wall -Wextra -Werror -I/home/lib $(pkg-config --cflags gtk+-2.0 libxml-2.0) -fPIC file2.c
gcc -shared -o lib.so file1.o file2.o

您的命令在一次调用中编译和链接

可以将命令拆分为编译命令和链接命令:

gcc -c -o file1.o -Wall -Wextra -Werror -I/home/lib $(pkg-config --cflags gtk+-2.0 libxml-2.0) -fPIC file1.c
gcc -c -o file2.o -Wall -Wextra -Werror -I/home/lib $(pkg-config --cflags gtk+-2.0 libxml-2.0) -fPIC file2.c
gcc -shared -o lib.so file1.o file2.o

GCC使用文件名中的扩展名来确定它们是什么类型以及如何处理它们。因此,您列出了一些以“.c”结尾的名称,这一事实告诉GCC将它们编译为c代码。如果您只给出以“.o”结尾的名称,GCC会将它们视为对象文件,而不会编译它们

编译后,默认情况下,GCC链接以生成可执行文件。“-shared”开关告诉它创建一个共享库

要仅编译而不进行链接,可以使用开关“-c”并删除“-shared”开关,还可以删除任何仅用于链接的命令参数或开关(“-Wl,--export dynamic”是其中之一,我不知道pkg配置是否会生成任何链接选项)。还要删除或更改“-o lib.so”,因为这会设置输出文件的名称,并且仅编译生成的对象文件不是您想要的名称


要仅链接,而不进行编译,只需列出目标文件而不是源文件,并删除影响编译的开关(“-I/home/lib”、“-fPIC”和pkg config生成的任何开关)。

GCC使用文件名中的扩展名来确定它们是什么类型以及如何处理它们。因此,您列出了一些以“.c”结尾的名称,这一事实告诉GCC将它们编译为c代码。如果您只给出以“.o”结尾的名称,GCC会将它们视为对象文件,而不会编译它们

编译后,默认情况下,GCC链接以生成可执行文件。“-shared”开关告诉它创建一个共享库

要仅编译而不进行链接,可以使用开关“-c”并删除“-shared”开关,还可以删除任何仅用于链接的命令参数或开关(“-Wl,--export dynamic”是其中之一,我不知道pkg配置是否会生成任何链接选项)。还要删除或更改“-o lib.so”,因为这会设置输出文件的名称,并且仅编译生成的对象文件不是您想要的名称


要仅链接而不编译,只需列出目标文件而不是源文件,并删除影响编译的开关(“-I/home/lib”、“-fPIC”和pkg config生成的任何开关)。

通过显示的命令,前端pogram
gcc
将编译器和链接器作为一个单元调用。或者你的意思是想知道哪些命令行选项和标志是编译专用的、链接专用的,以及两者通用的?你不链接任何东西。@P_uuj_uu_u_u_u_u_u_u_u_u_u_u_u_u_u共享库与可执行程序一样链接。是的,我想知道哪些命令行选项和标志是编译专用的,对于链接和共用
-Wl,
是链接器命令选项的开始,您可以将
--export dynamic
作为单个链接器选项。这将告诉
gcc
使用所示的编译器选项编译文件(以及通过调用
pkg config
生成的链接器,然后使用链接器选项调用链接器,--export dynamic。为详细输出添加
-v
,例如,
gcc-v….
,您将看到编译和链接所需的所有内容。与简单的汇编程序不同,在该程序中,您编译为对象,然后只需ll
ld
要链接到可执行文件,还需要做很多工作来链接C-runtime libs。通过您显示的命令,前端pogram
gcc
将编译器和链接器作为一个单元调用。或者您的意思是想知道哪些命令行选项和标志是编译专用的、链接专用的,以及两者通用的?您知道吗不要链接任何东西。@P_uuj_uuu共享库就像可执行程序一样链接。是的,我想知道哪些命令行选项和标志是特定于编译、链接和通用的。
-Wl,
是链接器命令选项的开始,您有
--export dynamic
作为单个链接器选项。This告诉
gcc
使用所示的编译器选项编译文件(以及通过调用
pkg config
生成的链接器,然后使用链接器选项调用链接器,--export dynamic。为详细输出添加
-v
,例如,
gcc-v….
,您将看到编译和链接所需的所有内容。与简单的汇编程序不同,在该程序中,您编译为对象,然后只需ll
ld
要链接到可执行文件,还需要做很多工作来链接C-runtime libs。这应该是注释而不是答案。这应该是注释而不是答案。现在这是一个很好的答案。我不知道GCC使用扩展来区分任务。现在这是一个很好的答案。我不知道GCC使用扩展来区分任务h任务。