【问题标题】:gcc compiling and linkinggcc 编译和链接
【发布时间】:2019-01-30 17:29:51
【问题描述】:

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

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 将编译器和链接器作为一个单元调用。还是您的意思是您想知道哪些命令行选项和标志是特定于编译、链接以及两者通用的?
  • 你没有链接任何东西。
  • @P__J__ 共享库就像可执行程序一样链接。
  • 是的,我想知道哪些命令行选项和标志是特定于编译、链接和两者通用的
  • -Wl, 是链接器命令选项的开始,您将 --export-dynamic 作为单个链接器选项。这告诉gcc 使用显示的编译器选项编译文件(以及从调用pkg-config 生成的那些,然后调用链接器使用链接器选项 ,--export-dynamic。添加-v 以获得详细信息输出,例如gcc -v .....,你会看到所有编译和链接的东西。不像一个简单的汇编程序,你编译成对象,然后简单地调用ld来链接到可执行文件,链接还有很多工作要做使用 C 运行时库。

标签: c gcc shared-libraries


【解决方案1】:

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

【讨论】:

  • 这应该是评论而不是答案。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 现在这是一个很好的答案。我不知道 GCC 使用扩展来区分任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2015-09-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多