gcc编译和链接

use*_*893 3 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
Run Code Online (Sandbox Code Playgroud)

它有效,并且创建的库也可以满足我的需要。我想知道编译和链接在这个命令字符串中的位置,所以请向我解释一下,并告诉我一种将它们划分为两个不同命令的方法,以便更好地理解。我需要理解这一点,因为我无法解释为什么这个库可以工作,即使它必须链接到另一个我从未链接过的库。

Max*_*kin 6

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

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

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
Run Code Online (Sandbox Code Playgroud)


Eri*_*hil 5

GCC 使用文件名中的扩展名来确定它们的类型以及如何处理它们。因此,您列出了一些以 \xe2\x80\x9c.c\xe2\x80\x9d 结尾的名称,这一事实告诉 GCC 将它们编译为 C 代码。如果您仅给出以 \xe2\x80\x9c.o\xe2\x80\x9d 结尾的名称,GCC 会将它们视为目标文件并且不会编译它们。

\n\n

编译后,GCC 默认链接生成可执行文件。\xe2\x80\x9c-shared\xe2\x80\x9d 开关告诉它创建一个共享库。

\n\n

要仅编译而不链接,您可以使用开关 \xe2\x80\x9c-c\xe2\x80\x9d 并删除 \xe2\x80\x9c-shared\xe2\x80\x9d 开关,并删除任何仅用于链接的命令参数或开关(\xe2\x80\x9c-Wl,--export-dynamic\xe2\x80\x9d 是其中之一,我不知道 pkg-config 是否会产生任何链接选项)。还要删除或更改 \xe2\x80\x9c-o lib.so\xe2\x80\x9d,因为它设置了用于输出文件的名称,并且它不是您想要的仅编译生成的目标文件。

\n\n

要仅链接而不编译,您只需列出目标文件而不是源文件,并删除影响编译的开关(\xe2\x80\x9c-I/home/lib\xe2\x80\x9d,\xe2\x80\x9c- fPIC\xe2\x80\x9d 以及 pkg-config 生成的任何内容)。

\n