我以此方式创建了一个共享库
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
它可以工作,创建的库也可以满足我的需要。 我想知道的是此命令字符串中的编译和链接在哪里,因此请向我解释一下,并告诉我将它们分为两个不同命令的方法,以更好地理解。 我需要了解这一点,因为即使无法将这个库链接到另一个我从未链接过的库,我也无法解释为什么它会起作用。
答案 0 :(得分:0)
gcc -c 选项仅用于编译。但是,我不确定这是否是您想要的。
答案 1 :(得分:0)
您的命令在一次调用中进行编译和链接。
您可以将命令拆分为编译和链接命令:
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
答案 2 :(得分:0)
GCC使用文件名中的扩展名来确定它们是什么类型以及如何使用它们。因此,您列出了一些以“ .c”结尾的名称的事实告诉GCC将其编译为C代码。如果仅给出以“ .o”结尾的名称,则GCC会将其视为目标文件,而不会编译它们。
编译后,默认情况下,GCC链接以生成可执行文件。 “共享”开关告诉它创建一个共享库。
仅编译而不链接,可以使用开关“ -c”并删除“共享”开关,也可以删除任何仅用于链接的命令参数或开关(“ -Wl,- -export-dynamic”就是其中之一,我不知道pkg-config是否会产生任何链接选项)。还要删除或更改“ -o lib.so”,因为这会设置要用于输出文件的名称,而这并不是仅通过编译生成的目标文件所需要的名称。
要仅链接而不进行编译,只需列出目标文件而不是源文件,并删除影响编译的开关(“ -I / home / lib”,“-fPIC”以及pkg-config产生的任何开关)。