使用链接器的 gcc 编译 - 差异

gcc compilation with linker - differences

这将编译 main.c 和 link 创建 .o 静态文件 abc 库和动态 xyz

gcc main.c -Wl,-Bstatic -labc -Wl,-Bdynamic -lxyz -o main

但我不确定其他一些组合:

  1. 这会将 main.c 编译为 main - 但在这种情况下 -lm 会做什么?

    gcc main.c -o main -lm

  2. 这里我们使用 -Wl 让我们为 linker 提供一些选项:-Bstatic, -lm 说它应该 link 静态编辑m 库 (libm) - 但是 -Wl,-Bdynamic 在这里做什么?它与哪个图书馆有关? gcc main.c -o main -Wl,-Bstatic -lm -Wl,-Bdynamic

    gcc main.c -o main -Wl,-Bstatic -lm -Wl,-Bdynamic

  3. -static 标志在这里做什么?为什么在 main.c 之前?

    gcc -static main.c -o main -lm

  1. -lm 将在 libm 中 link。默认情况下,gcc 将首先搜索共享库。如果找不到共享版本,它将搜索静态版本。
  2. 尾部-Wl,-Bdynamic是为了确保使用标准库的共享版本(即libc)。
  3. -static 阻止 link 使用共享库。它可以放在命令行的任何位置,并具有相同的效果。这与 -Wl,-Bstatic 的不同之处在于 -static 适用于所有库的 linking 而 -Wl,-Bstatic 仅适用于命令行中它之后的库。请注意 -static 也不同于 -Wl,-static。前者是 gcc 驱动程序选项,可防止所有动态 linking。后者是一个 ld 选项,是 -Wl,-Bstatic.
  4. 的别名