使用链接器的 gcc 编译 - 差异
gcc compilation with linker - differences
这将编译 main.c
和 link 创建 .o
静态文件 abc
库和动态 xyz
gcc main.c -Wl,-Bstatic -labc -Wl,-Bdynamic -lxyz -o main
但我不确定其他一些组合:
这会将 main.c
编译为 main
- 但在这种情况下 -lm
会做什么?
gcc main.c -o main -lm
这里我们使用 -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
-static
标志在这里做什么?为什么在 main.c
之前?
gcc -static main.c -o main -lm
-lm
将在 libm
中 link。默认情况下,gcc 将首先搜索共享库。如果找不到共享版本,它将搜索静态版本。
- 尾部
-Wl,-Bdynamic
是为了确保使用标准库的共享版本(即libc
)。
-static
阻止 link 使用共享库。它可以放在命令行的任何位置,并具有相同的效果。这与 -Wl,-Bstatic
的不同之处在于 -static
适用于所有库的 linking 而 -Wl,-Bstatic
仅适用于命令行中它之后的库。请注意 -static
也不同于 -Wl,-static
。前者是 gcc 驱动程序选项,可防止所有动态 linking。后者是一个 ld 选项,是 -Wl,-Bstatic
. 的别名
这将编译 main.c
和 link 创建 .o
静态文件 abc
库和动态 xyz
gcc main.c -Wl,-Bstatic -labc -Wl,-Bdynamic -lxyz -o main
但我不确定其他一些组合:
这会将
main.c
编译为main
- 但在这种情况下-lm
会做什么?gcc main.c -o main -lm
这里我们使用
-Wl
让我们为 linker 提供一些选项:-Bstatic, -lm
说它应该 link 静态编辑m
库 (libm) - 但是-Wl,-Bdynamic
在这里做什么?它与哪个图书馆有关? gcc main.c -o main -Wl,-Bstatic -lm -Wl,-Bdynamicgcc main.c -o main -Wl,-Bstatic -lm -Wl,-Bdynamic
-static
标志在这里做什么?为什么在main.c
之前?gcc -static main.c -o main -lm
-lm
将在libm
中 link。默认情况下,gcc 将首先搜索共享库。如果找不到共享版本,它将搜索静态版本。- 尾部
-Wl,-Bdynamic
是为了确保使用标准库的共享版本(即libc
)。 -static
阻止 link 使用共享库。它可以放在命令行的任何位置,并具有相同的效果。这与-Wl,-Bstatic
的不同之处在于-static
适用于所有库的 linking 而-Wl,-Bstatic
仅适用于命令行中它之后的库。请注意-static
也不同于-Wl,-static
。前者是 gcc 驱动程序选项,可防止所有动态 linking。后者是一个 ld 选项,是-Wl,-Bstatic
. 的别名