鱼C论坛

 找回密码
 立即注册
查看: 2291|回复: 7

[已解决]C的头文件和链接库疑问。

[复制链接]
发表于 2023-1-3 13:07:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
C中的不少内置函数,如printf()和scanf(),虽然在<stdio.h>中有声明原型(接口),但是具体的定义(实现)是在链接库文件中么?如果是,具体是哪个库文件呢?如果不是,又是在哪儿呢?请大佬指点一下,谢谢。
最佳答案
2023-1-3 13:34:10
但是具体的定义(实现)是在链接库文件中么?
是的

printf
scanf
这些函数在 /lib/libc.so.6 这个文件里面

  1. sh-5.1$ nm -D /lib/libc.so.6 | grep 'scanf\|printf'
  2. 000000000004ecc0 T __asprintf@@GLIBC_2.2.5
  3. 000000000004ecc0 W asprintf@@GLIBC_2.2.5
  4. 00000000001174d0 T __asprintf_chk@@GLIBC_2.8
  5.                  U _dl_fatal_printf@GLIBC_PRIVATE
  6. 000000000004ee60 T dprintf@@GLIBC_2.2.5
  7. 00000000001175c0 T __dprintf_chk@@GLIBC_2.8
  8. 000000000004ef80 T fprintf@@GLIBC_2.2.5
  9. 0000000000116050 T __fprintf_chk@@GLIBC_2.3.4
  10. 000000000004f040 T fscanf@@GLIBC_2.2.5
  11. 00000000000765b0 W fwprintf@@GLIBC_2.2.5
  12. 0000000000116fb0 T __fwprintf_chk@@GLIBC_2.4
  13. 00000000000768f0 T fwscanf@@GLIBC_2.2.5
  14. 000000000004ef80 W _IO_fprintf@@GLIBC_2.2.5
  15. 000000000004f770 T _IO_printf@@GLIBC_2.2.5
  16. 0000000000055fd0 T _IO_sprintf@@GLIBC_2.2.5
  17. 00000000000560a0 T _IO_sscanf@@GLIBC_2.2.5
  18. 0000000000056960 T _IO_vfprintf@@GLIBC_2.2.5
  19. 0000000000150ce0 T _IO_vfscanf@GLIBC_2.2.5
  20. 0000000000075490 T _IO_vsprintf@@GLIBC_2.2.5
  21. 000000000004f240 T __isoc99_fscanf@@GLIBC_2.7
  22. 00000000000bc1c0 T __isoc99_fwscanf@@GLIBC_2.7
  23. 000000000004f300 T __isoc99_scanf@@GLIBC_2.7
  24. 000000000004f3d0 T __isoc99_sscanf@@GLIBC_2.7
  25. 00000000000bc290 T __isoc99_swscanf@@GLIBC_2.7
  26. 000000000004f510 T __isoc99_vfscanf@@GLIBC_2.7
  27. 00000000000bc280 T __isoc99_vfwscanf@@GLIBC_2.7
  28. 000000000004f520 T __isoc99_vscanf@@GLIBC_2.7
  29. 000000000004f550 T __isoc99_vsscanf@@GLIBC_2.7
  30. 00000000000bc3d0 T __isoc99_vswscanf@@GLIBC_2.7
  31. 00000000000bc190 T __isoc99_vwscanf@@GLIBC_2.7
  32. 00000000000bc0c0 T __isoc99_wscanf@@GLIBC_2.7
  33. 000000000007be50 W obstack_printf@@GLIBC_2.2.5
  34. 00000000001176b0 T __obstack_printf_chk@@GLIBC_2.8
  35. 000000000007be40 W obstack_vprintf@@GLIBC_2.2.5
  36. 0000000000117780 T __obstack_vprintf_chk@@GLIBC_2.8
  37. 000000000004f840 T parse_printf_format@@GLIBC_2.2.5
  38. 000000000004f770 T printf@@GLIBC_2.2.5
  39. 0000000000115f80 T __printf_chk@@GLIBC_2.3.4
  40. 0000000000052a40 T __printf_fp@@GLIBC_2.2.5
  41. 0000000000054760 T printf_size@@GLIBC_2.2.5
  42. 00000000000551e0 T printf_size_info@@GLIBC_2.2.5
  43. 0000000000055c60 W register_printf_function@@GLIBC_2.2.5
  44. 0000000000055880 W register_printf_modifier@@GLIBC_2.10
  45. 0000000000055b90 W register_printf_specifier@@GLIBC_2.10
  46. 0000000000055c70 W register_printf_type@@GLIBC_2.10
  47. 0000000000055e40 T scanf@@GLIBC_2.2.5
  48. 0000000000055f10 T __snprintf@@GLIBC_PRIVATE
  49. 0000000000055f10 W snprintf@@GLIBC_2.2.5
  50. 0000000000115e70 T __snprintf_chk@@GLIBC_2.3.4
  51. 0000000000055fd0 T sprintf@@GLIBC_2.2.5
  52. 0000000000115d60 T __sprintf_chk@@GLIBC_2.3.4
  53. 00000000000560a0 T sscanf@@GLIBC_2.2.5
  54. 0000000000076670 T swprintf@@GLIBC_2.2.5
  55. 0000000000116dd0 T __swprintf_chk@@GLIBC_2.4
  56. 0000000000076c10 T swscanf@@GLIBC_2.2.5
  57. 000000000007b7b0 W vasprintf@@GLIBC_2.2.5
  58. 00000000001175a0 T __vasprintf_chk@@GLIBC_2.8
  59. 000000000007b940 W vdprintf@@GLIBC_2.2.5
  60. 0000000000117690 T __vdprintf_chk@@GLIBC_2.8
  61. 0000000000056960 T vfprintf@@GLIBC_2.2.5
  62. 0000000000116140 T __vfprintf_chk@@GLIBC_2.3.4
  63. 000000000005bf50 T __vfscanf@@GLIBC_2.2.5
  64. 000000000005bf50 W vfscanf@@GLIBC_2.2.5
  65. 0000000000064a90 W vfwprintf@@GLIBC_2.2.5
  66. 00000000001170a0 T __vfwprintf_chk@@GLIBC_2.4
  67. 000000000006a350 W vfwscanf@@GLIBC_2.2.5
  68. 0000000000071560 T vprintf@@GLIBC_2.2.5
  69. 0000000000116120 T __vprintf_chk@@GLIBC_2.3.4
  70. 000000000007b950 W vscanf@@GLIBC_2.2.5
  71. 000000000007bb00 W __vsnprintf@@GLIBC_2.2.5
  72. 000000000007bb00 W vsnprintf@@GLIBC_2.2.5
  73. 0000000000115f40 T __vsnprintf_chk@@GLIBC_2.3.4
  74. 0000000000075490 W vsprintf@@GLIBC_2.2.5
  75. 0000000000115e40 T __vsprintf_chk@@GLIBC_2.3.4
  76. 0000000000075550 W __vsscanf@@GLIBC_2.2.5
  77. 0000000000075550 W vsscanf@@GLIBC_2.2.5
  78. 0000000000076b50 W vswprintf@@GLIBC_2.2.5
  79. 0000000000116ea0 T __vswprintf_chk@@GLIBC_2.4
  80. 0000000000076b60 W vswscanf@@GLIBC_2.2.5
  81. 0000000000076730 T vwprintf@@GLIBC_2.2.5
  82. 0000000000117080 T __vwprintf_chk@@GLIBC_2.4
  83. 00000000000769b0 T vwscanf@@GLIBC_2.2.5
  84. 0000000000076750 T wprintf@@GLIBC_2.2.5
  85. 0000000000116ee0 T __wprintf_chk@@GLIBC_2.4
  86. 0000000000076820 T wscanf@@GLIBC_2.2.5
  87. sh-5.1$
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-1-3 13:29:23 | 显示全部楼层
顶一下(我也有这个疑问)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-3 13:34:10 | 显示全部楼层    本楼为最佳答案   
但是具体的定义(实现)是在链接库文件中么?
是的

printf
scanf
这些函数在 /lib/libc.so.6 这个文件里面

  1. sh-5.1$ nm -D /lib/libc.so.6 | grep 'scanf\|printf'
  2. 000000000004ecc0 T __asprintf@@GLIBC_2.2.5
  3. 000000000004ecc0 W asprintf@@GLIBC_2.2.5
  4. 00000000001174d0 T __asprintf_chk@@GLIBC_2.8
  5.                  U _dl_fatal_printf@GLIBC_PRIVATE
  6. 000000000004ee60 T dprintf@@GLIBC_2.2.5
  7. 00000000001175c0 T __dprintf_chk@@GLIBC_2.8
  8. 000000000004ef80 T fprintf@@GLIBC_2.2.5
  9. 0000000000116050 T __fprintf_chk@@GLIBC_2.3.4
  10. 000000000004f040 T fscanf@@GLIBC_2.2.5
  11. 00000000000765b0 W fwprintf@@GLIBC_2.2.5
  12. 0000000000116fb0 T __fwprintf_chk@@GLIBC_2.4
  13. 00000000000768f0 T fwscanf@@GLIBC_2.2.5
  14. 000000000004ef80 W _IO_fprintf@@GLIBC_2.2.5
  15. 000000000004f770 T _IO_printf@@GLIBC_2.2.5
  16. 0000000000055fd0 T _IO_sprintf@@GLIBC_2.2.5
  17. 00000000000560a0 T _IO_sscanf@@GLIBC_2.2.5
  18. 0000000000056960 T _IO_vfprintf@@GLIBC_2.2.5
  19. 0000000000150ce0 T _IO_vfscanf@GLIBC_2.2.5
  20. 0000000000075490 T _IO_vsprintf@@GLIBC_2.2.5
  21. 000000000004f240 T __isoc99_fscanf@@GLIBC_2.7
  22. 00000000000bc1c0 T __isoc99_fwscanf@@GLIBC_2.7
  23. 000000000004f300 T __isoc99_scanf@@GLIBC_2.7
  24. 000000000004f3d0 T __isoc99_sscanf@@GLIBC_2.7
  25. 00000000000bc290 T __isoc99_swscanf@@GLIBC_2.7
  26. 000000000004f510 T __isoc99_vfscanf@@GLIBC_2.7
  27. 00000000000bc280 T __isoc99_vfwscanf@@GLIBC_2.7
  28. 000000000004f520 T __isoc99_vscanf@@GLIBC_2.7
  29. 000000000004f550 T __isoc99_vsscanf@@GLIBC_2.7
  30. 00000000000bc3d0 T __isoc99_vswscanf@@GLIBC_2.7
  31. 00000000000bc190 T __isoc99_vwscanf@@GLIBC_2.7
  32. 00000000000bc0c0 T __isoc99_wscanf@@GLIBC_2.7
  33. 000000000007be50 W obstack_printf@@GLIBC_2.2.5
  34. 00000000001176b0 T __obstack_printf_chk@@GLIBC_2.8
  35. 000000000007be40 W obstack_vprintf@@GLIBC_2.2.5
  36. 0000000000117780 T __obstack_vprintf_chk@@GLIBC_2.8
  37. 000000000004f840 T parse_printf_format@@GLIBC_2.2.5
  38. 000000000004f770 T printf@@GLIBC_2.2.5
  39. 0000000000115f80 T __printf_chk@@GLIBC_2.3.4
  40. 0000000000052a40 T __printf_fp@@GLIBC_2.2.5
  41. 0000000000054760 T printf_size@@GLIBC_2.2.5
  42. 00000000000551e0 T printf_size_info@@GLIBC_2.2.5
  43. 0000000000055c60 W register_printf_function@@GLIBC_2.2.5
  44. 0000000000055880 W register_printf_modifier@@GLIBC_2.10
  45. 0000000000055b90 W register_printf_specifier@@GLIBC_2.10
  46. 0000000000055c70 W register_printf_type@@GLIBC_2.10
  47. 0000000000055e40 T scanf@@GLIBC_2.2.5
  48. 0000000000055f10 T __snprintf@@GLIBC_PRIVATE
  49. 0000000000055f10 W snprintf@@GLIBC_2.2.5
  50. 0000000000115e70 T __snprintf_chk@@GLIBC_2.3.4
  51. 0000000000055fd0 T sprintf@@GLIBC_2.2.5
  52. 0000000000115d60 T __sprintf_chk@@GLIBC_2.3.4
  53. 00000000000560a0 T sscanf@@GLIBC_2.2.5
  54. 0000000000076670 T swprintf@@GLIBC_2.2.5
  55. 0000000000116dd0 T __swprintf_chk@@GLIBC_2.4
  56. 0000000000076c10 T swscanf@@GLIBC_2.2.5
  57. 000000000007b7b0 W vasprintf@@GLIBC_2.2.5
  58. 00000000001175a0 T __vasprintf_chk@@GLIBC_2.8
  59. 000000000007b940 W vdprintf@@GLIBC_2.2.5
  60. 0000000000117690 T __vdprintf_chk@@GLIBC_2.8
  61. 0000000000056960 T vfprintf@@GLIBC_2.2.5
  62. 0000000000116140 T __vfprintf_chk@@GLIBC_2.3.4
  63. 000000000005bf50 T __vfscanf@@GLIBC_2.2.5
  64. 000000000005bf50 W vfscanf@@GLIBC_2.2.5
  65. 0000000000064a90 W vfwprintf@@GLIBC_2.2.5
  66. 00000000001170a0 T __vfwprintf_chk@@GLIBC_2.4
  67. 000000000006a350 W vfwscanf@@GLIBC_2.2.5
  68. 0000000000071560 T vprintf@@GLIBC_2.2.5
  69. 0000000000116120 T __vprintf_chk@@GLIBC_2.3.4
  70. 000000000007b950 W vscanf@@GLIBC_2.2.5
  71. 000000000007bb00 W __vsnprintf@@GLIBC_2.2.5
  72. 000000000007bb00 W vsnprintf@@GLIBC_2.2.5
  73. 0000000000115f40 T __vsnprintf_chk@@GLIBC_2.3.4
  74. 0000000000075490 W vsprintf@@GLIBC_2.2.5
  75. 0000000000115e40 T __vsprintf_chk@@GLIBC_2.3.4
  76. 0000000000075550 W __vsscanf@@GLIBC_2.2.5
  77. 0000000000075550 W vsscanf@@GLIBC_2.2.5
  78. 0000000000076b50 W vswprintf@@GLIBC_2.2.5
  79. 0000000000116ea0 T __vswprintf_chk@@GLIBC_2.4
  80. 0000000000076b60 W vswscanf@@GLIBC_2.2.5
  81. 0000000000076730 T vwprintf@@GLIBC_2.2.5
  82. 0000000000117080 T __vwprintf_chk@@GLIBC_2.4
  83. 00000000000769b0 T vwscanf@@GLIBC_2.2.5
  84. 0000000000076750 T wprintf@@GLIBC_2.2.5
  85. 0000000000116ee0 T __wprintf_chk@@GLIBC_2.4
  86. 0000000000076820 T wscanf@@GLIBC_2.2.5
  87. sh-5.1$
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-3 13:38:26 From FishC Mobile | 显示全部楼层
看看这个有没有一点帮助
https://man.archlinux.org/man/scanf.3#LIBRARY
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-3 14:58:35 | 显示全部楼层
人造人 发表于 2023-1-3 13:34
但是具体的定义(实现)是在链接库文件中么?
是的

谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-3 15:05:10 | 显示全部楼层
人造人 发表于 2023-1-3 13:34
但是具体的定义(实现)是在链接库文件中么?
是的

大佬,我在追问一下,编译器在编译源代码的时候,遇到这些内置函数,是自动连接到这些链接库文件么?不需要想像链接自己做的链接文件一样,选项上加上 -L路径,如gcc -L/home/ues_name/lib abc.c这样的形式吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2023-1-3 15:42:19 | 显示全部楼层
gchzp1993 发表于 2023-1-3 15:05
大佬,我在追问一下,编译器在编译源代码的时候,遇到这些内置函数,是自动连接到这些链接库文件么?不需 ...

这个不需要你手动加,gcc这个命令在内部自己加的
--verbose选项可以查看详细的编译步骤

  1. sh-5.1$ gcc --verbose -o main main.c
  2. Using built-in specs.
  3. COLLECT_GCC=gcc
  4. COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/lto-wrapper
  5. Target: x86_64-pc-linux-gnu
  6. Configured with: /build/gcc/src/gcc/configure --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror
  7. Thread model: posix
  8. Supported LTO compression algorithms: zlib zstd
  9. gcc version 12.2.0 (GCC)
  10. COLLECT_GCC_OPTIONS='-v' '-o' 'main' '-mtune=generic' '-march=x86-64'
  11. /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/cc1 -quiet -v main.c -quiet -dumpbase main.c -dumpbase-ext .c -mtune=generic -march=x86-64 -version -o /tmp/cc53u5Ip.s
  12. GNU C17 (GCC) version 12.2.0 (x86_64-pc-linux-gnu)
  13.         compiled by GNU C version 12.2.0, GMP version 6.2.1, MPFR version 4.1.0-p13, MPC version 1.2.1, isl version isl-0.25-GMP

  14. warning: MPFR header version 4.1.0-p13 differs from library version 4.1.1-p1.
  15. warning: MPC header version 1.2.1 differs from library version 1.3.1.
  16. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
  17. ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../x86_64-pc-linux-gnu/include"
  18. #include "..." search starts here:
  19. #include <...> search starts here:
  20. /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/include
  21. /usr/local/include
  22. /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/include-fixed
  23. /usr/include
  24. End of search list.
  25. GNU C17 (GCC) version 12.2.0 (x86_64-pc-linux-gnu)
  26.         compiled by GNU C version 12.2.0, GMP version 6.2.1, MPFR version 4.1.0-p13, MPC version 1.2.1, isl version isl-0.25-GMP

  27. warning: MPFR header version 4.1.0-p13 differs from library version 4.1.1-p1.
  28. warning: MPC header version 1.2.1 differs from library version 1.3.1.
  29. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
  30. Compiler executable checksum: 4b798a352742e8322eaa4a166b8f6299
  31. COLLECT_GCC_OPTIONS='-v' '-o' 'main' '-mtune=generic' '-march=x86-64'
  32. as -v --64 -o /tmp/ccnRHJhA.o /tmp/cc53u5Ip.s
  33. GNU assembler version 2.39.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.39.0
  34. COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/
  35. LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../:/lib/:/usr/lib/
  36. COLLECT_GCC_OPTIONS='-v' '-o' 'main' '-mtune=generic' '-march=x86-64' '-dumpdir' 'main.'
  37. /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccby7A03.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o main /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0 -L/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../.. /tmp/ccnRHJhA.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../lib/crtn.o
  38. COLLECT_GCC_OPTIONS='-v' '-o' 'main' '-mtune=generic' '-march=x86-64' '-dumpdir' 'main.'
  39. sh-5.1$
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-3 17:50:51 | 显示全部楼层
人造人 发表于 2023-1-3 15:42
这个不需要你手动加,gcc这个命令在内部自己加的
--verbose选项可以查看详细的编译步骤

多谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 01:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表