相关阅读
C语言
https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482
gcc是一个命令,严格意义上说,它只是一个驱动程序,而不是一个编译器。gcc负责调用GNU工具链中的预处理器、编译器、汇编器、链接器等工具,通过传递不同的选项给gcc命令,可以让其只完成某些步骤,比如下面的命令,用于只对源文件进行预处理。
gcc -E test.c
实际上,gcc命令的参数不仅可以是C语言源文件(.c后缀),也可以是C++语言(.cc、.cpp、.c++、.CPP等后缀), 还可以是fortran语言(.f、.for、.f90、.f95等后缀),ada语言(.adb、.adb后缀)等。
具体支持的语言后缀,可以在gcc命令的源代码中找到,如下所示(也可以使用man命令在gcc的手册中找到)。
- 1409 static const struct compiler default_compilers[] =
- 1410 {
- 1411 /* Add lists of suffixes of known languages here. If those languages
- 1412 were not present when we built the driver, we will hit these copies
- 1413 and be given a more meaningful error than "file not used since
- 1414 linking is not done". */
- 1415 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
- 1416 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
- 1417 {".mii", "#Objective-C++", 0, 0, 0},
- 1418 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
- 1419 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
- 1420 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
- 1421 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
- 1422 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
- 1423 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
- 1424 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
- 1425 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
- 1426 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
- 1427 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
- 1428 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
- 1429 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
- 1430 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
- 1431 {".r", "#Ratfor", 0, 0, 0},
- 1432 {".go", "#Go", 0, 1, 0},
- 1433 {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
- 1434 /* Next come the entries for C. */
- 1435 {".c", "@c", 0, 0, 1},
- 1436 {"@c",
- 1437 /* cc1 has an integrated ISO C preprocessor. We should invoke the
- 1438 external preprocessor if -save-temps is given. */
- 1439 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
- 1440 %{!E:%{!M:%{!MM:\
- 1441 %{traditional:\
- 1442 %eGNU C no longer supports -traditional without -E}\
- 1443 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
- 1444 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
- 1445 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
- 1446 %(cc1_options)}\
- 1447 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
- 1448 cc1 %(cpp_unique_options) %(cc1_options)}}}\
- 1449 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
- 1450 {"-",
- 1451 "%{!E:%e-E or -x required when input is from standard input}\
- 1452 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
- 1453 {".h", "@c-header", 0, 0, 0},
- 1454 {"@c-header",
- 1455 /* cc1 has an integrated ISO C preprocessor. We should invoke the
- 1456 external preprocessor if -save-temps is given. */
- 1457 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
- 1458 %{!E:%{!M:%{!MM:\
- 1459 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
- 1460 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
- 1461 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
- 1462 %(cc1_options)\
- 1463 %{!fsyntax-only:%{!S:-o %g.s} \
- 1464 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
- 1465 %W{o*:--output-pch=%*}}%V}}\
- 1466 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
- 1467 cc1 %(cpp_unique_options) %(cc1_options)\
- 1468 %{!fsyntax-only:%{!S:-o %g.s} \
- 1469 %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
- 1470 %W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
- 1471 {".i", "@cpp-output", 0, 0, 0},
- 1472 {"@cpp-output",
- 1473 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
- 1474 {".s", "@assembler", 0, 0, 0},
- 1475 {"@assembler",
- 1476 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
- 1477 {".sx", "@assembler-with-cpp", 0, 0, 0},
- 1478 {".S", "@assembler-with-cpp", 0, 0, 0},
- 1479 {"@assembler-with-cpp",
- 1480 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
- 1481 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
- 1482 %{E|M|MM:%(cpp_debug_options)}\
- 1483 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
- 1484 as %(asm_debug) %(asm_options) %|.s %A }}}}"
- 1485 #else
- 1486 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
- 1487 %{E|M|MM:%(cpp_debug_options)}\
- 1488 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
- 1489 as %(asm_debug) %(asm_options) %m.s %A }}}}"
- 1490 #endif
- 1491 , 0, 0, 0},
- 1492
- 1493 #include "specs.h"
- 1494 /* Mark end of table. */
- 1495 {0, 0, 0, 0, 0}
- 1496 };
因为gcc命令使用后缀识别源代码,从而调用不同的工具,所以尝试向gcc命令传递一个没有后缀的文本文件是会报错的,即使文本文件的内容确实是源代码,如下所示。
- $ gcc test
- test: file not recognized: File format not recognized
- collect2: error: ld returned 1 exit status
下面我们以C语言举例,了解gcc命令是如何处理C源代码文件的。
- // test.c
- #define TT 1
- int main()
- {
- int a=TT;
- }
向gcc命令传递-v选项,可以让其打印其在执行期间调用的所有工具,如下所示。
- $ gcc -v test.c -o test
- Using built-in specs.
- COLLECT_GCC=gcc
- COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
- Target: x86_64-redhat-linux
- Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
- Thread model: posix
- gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
- COLLECT_GCC_OPTIONS='-v' '-o' 'test' '-mtune=generic' '-march=x86-64'
- /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/cc1 -quiet -v test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -o /tmp/ccifUeJP.s
- GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
- compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
- GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
- ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include-fixed"
- ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/include"
- #include "..." search starts here:
- #include <...> search starts here:
- /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include
- /usr/local/include
- /usr/include
- End of search list.
- GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
- compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
- GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
- Compiler executable checksum: d8f4c208bcaf7e279b70f7290eda3265
- COLLECT_GCC_OPTIONS='-v' '-o' 'test' '-mtune=generic' '-march=x86-64'
- as -v --64 -o /tmp/cceJQa5q.o /tmp/ccifUeJP.s
- GNU assembler version 2.27 (x86_64-redhat-linux) using BFD version version 2.27-43.base.el7
- COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
- LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
- COLLECT_GCC_OPTIONS='-v' '-o' 'test' '-mtune=generic' '-march=x86-64'
- /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o test /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/cceJQa5q.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o
可以从上面的输出信息中注意到,gcc命令调用了cc1命令,这才是真正意义上的c编译器。
/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/cc1 -quiet -v test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -o /tmp/ccifUeJP.s
细心的你可能会发现,gcc命令并没有调用cpp(c preprocessor,C预处理器),这是因为这部分功能已经被整合进cc1命令中了。cc1命令编译的输出结果是一个汇编文件,保存为/tmp/ccifUeJP.s,因为它只是一个中间结果。
下面gcc命令又调用了as命令,这是一个汇编器,输出结果是一个.o后缀的目标文件/tmp/cceJQa5q.o,与上面的汇编文件一样,它也是一个中间结果。
as -v --64 -o /tmp/cceJQa5q.o /tmp/ccifUeJP.s
最后,gcc命令调用了collect2命令,这是链接器ld的一个封装,用于链接所有的目标文件,并生成最终的可执行文件test,这是我们最开始传递给gcc命令的参数。
/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o test /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/cceJQa5q.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o
既然gcc命令可以处理不同语言的源代码,那为什么要针对C++语言推出g++驱动程序,对于fortran语言推出gfortran驱动程序,对于ada语言推出gnat驱动程序呢?下面以fortran语言举例说明。
- ! add_numbers.f90
- program AddNumbers
- implicit none
- integer :: number1, number2, sum
-
- ! 用户输入两个整数
- print *, 'Enter two integers:'
- read *, number1, number2
-
- ! 计算两个数的和
- sum = number1 + number2
-
- ! 打印结果
- print *, 'The sum of ', number1, ' and ', number2, ' is ', sum
- end program AddNumbers
下面直接使用gcc命令编译它,输出结果如下所示。
- $ gcc -v add_numbers.f90 -o add_numbers
- Using built-in specs.
- COLLECT_GCC=gcc
- COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
- Target: x86_64-redhat-linux
- Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
- Thread model: posix
- gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
- /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/f951 add_numbers.f90 -quiet -dumpbase add_numbers.f90 -mtune=generic -march=x86-64 -auxbase add_numbers -version -fintrinsic-modules-path /usr/lib/gcc/x86_64-redhat-linux/4.8.5/finclude -o /tmp/ccQACj24.s
- GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
- compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
- GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
- GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
- compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
- GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
- as -v --64 -o /tmp/cctgPTMM.o /tmp/ccQACj24.s
- GNU assembler version 2.27 (x86_64-redhat-linux) using BFD version version 2.27-43.base.el7
- COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
- LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
- /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o add_numbers /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/cctgPTMM.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o
- /tmp/cctgPTMM.o: In function `MAIN__':
- add_numbers.f90:(.text+0x3f): undefined reference to `_gfortran_st_write'
- add_numbers.f90:(.text+0x58): undefined reference to `_gfortran_transfer_character_write'
- add_numbers.f90:(.text+0x67): undefined reference to `_gfortran_st_write_done'
- add_numbers.f90:(.text+0x9f): undefined reference to `_gfortran_st_read'
- add_numbers.f90:(.text+0xba): undefined reference to `_gfortran_transfer_integer'
- add_numbers.f90:(.text+0xd5): undefined reference to `_gfortran_transfer_integer'
- add_numbers.f90:(.text+0xe4): undefined reference to `_gfortran_st_read_done'
- add_numbers.f90:(.text+0x127): undefined reference to `_gfortran_st_write'
- add_numbers.f90:(.text+0x140): undefined reference to `_gfortran_transfer_character_write'
- add_numbers.f90:(.text+0x15b): undefined reference to `_gfortran_transfer_integer_write'
- add_numbers.f90:(.text+0x174): undefined reference to `_gfortran_transfer_character_write'
- add_numbers.f90:(.text+0x18f): undefined reference to `_gfortran_transfer_integer_write'
- add_numbers.f90:(.text+0x1a8): undefined reference to `_gfortran_transfer_character_write'
- add_numbers.f90:(.text+0x1c3): undefined reference to `_gfortran_transfer_integer_write'
- add_numbers.f90:(.text+0x1d2): undefined reference to `_gfortran_st_write_done'
- /tmp/cctgPTMM.o: In function `main':
- add_numbers.f90:(.text+0x1f4): undefined reference to `_gfortran_set_args'
- add_numbers.f90:(.text+0x203): undefined reference to `_gfortran_set_options'
- collect2: error: ld returned 1 exit status
从上面的输出中可以看出,在对fortran文件进行预处理、汇编、编译、链接的过程中,gcc命令调用了f951编译器,as汇编器和collect2链接器,但是在最后的链接阶段却报错了,错误原因是ld找不到Fortran运行时库中的一些必要函数,如_gfortran_st_write等。
这可以通过向gcc命令传递一些选项来解决,如下所示。
- $ gcc -v add_numbers.f90 -lgfortran -o add_numbers
- Using built-in specs.
- COLLECT_GCC=gcc
- COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
- Target: x86_64-redhat-linux
- Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
- Thread model: posix
- gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
- /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/f951 add_numbers.f90 -quiet -dumpbase add_numbers.f90 -mtune=generic -march=x86-64 -auxbase add_numbers -version -fintrinsic-modules-path /usr/lib/gcc/x86_64-redhat-linux/4.8.5/finclude -o /tmp/cc4GFhEz.s
- GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
- compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
- GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
- GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
- compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
- GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
- as -v --64 -o /tmp/ccS7OrZX.o /tmp/cc4GFhEz.s
- GNU assembler version 2.27 (x86_64-redhat-linux) using BFD version version 2.27-43.base.el7
- COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
- LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
- /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o add_numbers /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/ccS7OrZX.o -lgfortran -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o
- $ ./add_numbers
- Enter two integers:
- 1
- 2
- The sum of 1 and 2 is 3
如果使用gfortran命令,则无需添加选项,如下所示。
- $ gfortran -v add_numbers.f90 -o add_numbers
- Driving: gfortran -v add_numbers.f90 -o add_numbers -l gfortran -l m -shared-libgcc
- Using built-in specs.
- COLLECT_GCC=gfortran
- COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
- Target: x86_64-redhat-linux
- Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
- Thread model: posix
- gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
- /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/f951 add_numbers.f90 -quiet -dumpbase add_numbers.f90 -mtune=generic -march=x86-64 -auxbase add_numbers -version -fintrinsic-modules-path /usr/lib/gcc/x86_64-redhat-linux/4.8.5/finclude -o /tmp/ccOxqcS0.s
- GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
- compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
- GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
- GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
- compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
- GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
- as -v --64 -o /tmp/cc4yjj1R.o /tmp/ccOxqcS0.s
- GNU assembler version 2.27 (x86_64-redhat-linux) using BFD version version 2.27-43.base.el7
- Reading specs from /usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgfortran.spec
- rename spec lib to liborig
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
- COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
- LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
- COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
- /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o add_numbers /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/cc4yjj1R.o -lgfortran -lm -lgcc_s -lgcc -lquadmath -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o