繁体   English   中英

gcc编译和链接

[英]gcc compiling and linking

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

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 -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链接以生成可执行文件。 “共享”开关告诉它创建一个共享库。

要仅进行编译而不进行链接,可以使用开关“ -c”并删除“共享”开关,还可以删除任何仅用于链接的命令参数或开关(“ -Wl,-export-动态”是其中之一,我不知道pkg-config是否会产生任何链接选项)。 还要删除或更改“ -o lib.so”,因为这将设置要用于输出文件的名称,而这并不是仅通过编译生成的目标文件所需要的名称。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM