为什么一个简单的 c 程序链接到 libc.a,而不是 libc.so?
Why a simple c program links to libc.a, not libc.so?
我的问题是,是否总是需要 libc.a,即使我希望 link 和 libc.so。
我搜索了互联网,它给出了 3 个可能的答案(冲突)
1. c program will require to link to libc.a and crt1.o files
2. for "-l" option, ".so" is preferred against ".a"
3. There're both libc.a and libc.so
那么我的问题的正确答案应该是什么?
如果你想link反对libc.so而不是libc.a,你不需要做任何特别的事情,这是默认的。
第一个答案已过时,不适用于大多数 Linux 发行版。默认情况下,C 程序需要 libc.so 但不需要 libc.a.
第二个答案默认正确。您需要提供一个 linker 标志,例如 -static 来更改此首选项。请注意,此答案适用于所有库,而不仅仅是 libc。
第三个答案在大多数 Linux 发行版中都是正确的。
对于 GNU libc(大多数 Linux 发行版都提供),不推荐针对 libc.a 静态 linking 您的可执行文件,这可能不起作用。这是可行的,但你需要确切地知道你在做什么并跳过一些障碍,否则你的可执行文件仍将依赖于 libc.so。
其他版本的libc可能更多static-linking-friendly.
我的问题是,是否总是需要 libc.a,即使我希望 link 和 libc.so。 我搜索了互联网,它给出了 3 个可能的答案(冲突)
1. c program will require to link to libc.a and crt1.o files
2. for "-l" option, ".so" is preferred against ".a"
3. There're both libc.a and libc.so
那么我的问题的正确答案应该是什么?
如果你想link反对libc.so而不是libc.a,你不需要做任何特别的事情,这是默认的。
第一个答案已过时,不适用于大多数 Linux 发行版。默认情况下,C 程序需要 libc.so 但不需要 libc.a.
第二个答案默认正确。您需要提供一个 linker 标志,例如 -static 来更改此首选项。请注意,此答案适用于所有库,而不仅仅是 libc。
第三个答案在大多数 Linux 发行版中都是正确的。
对于 GNU libc(大多数 Linux 发行版都提供),不推荐针对 libc.a 静态 linking 您的可执行文件,这可能不起作用。这是可行的,但你需要确切地知道你在做什么并跳过一些障碍,否则你的可执行文件仍将依赖于 libc.so。
其他版本的libc可能更多static-linking-friendly.