C语言:详解gcc驱动程序完成编译、汇编、链接的过程

相关阅读

C语言icon-default.png?t=N7T8https://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 AddNumbersimplicit noneinteger :: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

翻译《The Old New Thing》- What’s with this MSH_MOUSEWHEEL message?

Whats with this MSH_MOUSEWHEEL message? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080806-00/?p21353 Raymond Chen 2008年06月06日 MSH_MOUSEWHEEL 消息是怎么回事&#xff1f; 硬件团队正在研发一种鼠标滚轮设备&#xff0c;并…

matrix-breakout-2-morpheus vulnhub靶场

端口扫描 80 81 需要用户名密码登录 目录扫描 robots.txt 妹用 找不到利用点&#xff0c;换个扫描器再扫 发现新的文件 graffiti.txt graffiti.php 输入的数据Post后会回显到页面上 抓包看看&#xff0c;居然直接传文件路径 发现我们post的数据被写入了graffiti.…

yolov5-ros模型结合zed2相机部署在 Ubuntu系统

前言 本篇文章主要讲解yolov5-ros模型结合zed2相机进行实时检测&#xff0c;经改进实现了红绿灯检测&#xff0c;并输出检测类别与置信度&#xff01; 目录 一、环境配置二、zed2驱动安装三、yolov5-ros功能包配置四、运行官方权重文件四、运行自己权重文件 一、环境配置 1、…

android睡眠分期图

一、效果图 做医疗类项目&#xff0c;经常会遇到做各种图表&#xff0c;本文做的睡眠分期图。 二、代码 引入用到的库 api joda-time:joda-time:2.10.1 调用代码 /*** 睡眠* 分期*/private SleepChartAdapter mAdapter;private SleepChartAttrs mAttrs;private List<SleepI…

不会制作企业版电子书?学会这几个步骤就好啦!

公司安排你制作一本专业的电子书&#xff0c;不知道如何下手&#xff1f;别担心&#xff0c;今天LookLook同学就来给大家分享一下如何轻松制作企业版电子书。参考这几个步骤&#xff0c;相信你一定能轻松搞定&#xff01; 第一步&#xff1a;明确电子书的目标和受众 在开始制作…

zeppelin 未授权任意命令执行漏洞复现

一、命令执行复现 访问http://ip:8080&#xff0c;打开zeppelin页面&#xff0c;&#xff08;zeppelin默认监听端口在8080&#xff09; 点击Notebook->create new note创建新笔记 在创建笔记的时候选择Default Interpreter为sh&#xff0c;即可执行sh命令 如下图&#x…

最新去水印小程序源码分享/无需后台/对接接口/支持全网去水印功能

最新去水印小程序源码分享&#xff1a;无需后台、对接接口&#xff0c;支持全网去水印功能&#xff0c;经过测试发现&#xff0c;该去水印小程序的解析接口需要付费使用。如果您有免费的解析接口&#xff0c;可以自行替换原有接口。 不过&#xff0c;不论是否付费&#xff0c;…

JAVA小案例-分别计算100以内奇数和偶数的和

JAVA小案例-分别计算100以内奇数和偶数的和 没啥可说的&#xff0c;就是for循环加if分支&#xff0c;也可以用while写。 代码如下&#xff1a; public class Jiouhe {/*** 分别计算100以内奇数和偶数的和* param args*/public static void main(String[] args){int sum10;in…

老程序员学习AI大模型的焦虑与机遇

前言 在这个科技飞速发展的时代&#xff0c;AI大模型成为了编程领域的热门话题。许多人都认为&#xff0c;学习AI大模型是获取高薪职位和实现职业发展的关键。然而&#xff0c;作为一名拥有十多年编程经验的老程序员&#xff0c;我不得不承认&#xff0c;面对这一新兴技术&…

WebGL开发地理信息系统

WebGL开发地理信息系统&#xff08;GIS&#xff09;是一项复杂且具有挑战性的任务&#xff0c;需要解决一系列技术难点。以下是一些主要的技术难点及其可能的解决方案。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.大规模数据渲染…

SQL语句练习每日5题(一)

一、查询 题目1——查询所有列&#xff1a; 现在运营想要查看用户信息表中所有的数据&#xff0c;请你取出相应结果 答案&#xff1a; select * from user_profile 题目2——查询多列&#xff1a; 请取出用户的设备id对应的性别、年龄和学校的数据 答案&#xff1a;select …

QT:QML中使用Loader加载界面

目录 一.介绍 二.实现 三.效果展示 四.代码 一.介绍 在QML中使用Loader加载界面&#xff0c;可以带来诸多好处&#xff0c;如提高应用程序的启动速度、动态地改变界面内容、根据条件加载不同的组件、更有效地使用内存以及帮助分割应用逻辑等。 1.延迟加载&#xff1a;QML…

苹果不会在WWDC 2024中推出任何搭载M4芯片的Mac电脑

虽然苹果公司已在上月推出了首搭 M4 芯片的 iPad Pro&#xff0c;不过彭博社的马克・古尔曼在最近的实时通讯中透露苹果公司不会在即将进行的 WWDC 2024 开发者大会中推出任何搭载 M4 芯片的 Mac 电脑&#xff08;不会推出任何硬件产品&#xff09;。 此前报道&#xff0c;苹果…

linux命令别名与shell函数

# 修改网卡配置 alias vinetwork"vi /etc/sysconfig/network-scripts/ifcfg-ens33" 1. 方法和调用在同一个文件 # 定义shell函数,返回值通过$?获取 function say_hello(){ echo "hello shell" return 1 } # 使用shell函数 say_hello # 执行脚本后接收返…

公寓远程抄表系统:智能管理方法新的篇章

1.界定和功能 公寓远程抄表系统是一种前沿的自动化控制&#xff0c;它允许物业管理管理人员在远离现场部位收集和分析公寓里的电力能源使用数据&#xff0c;似水、电、气等。根据集成传感器、物联网产品和云计算&#xff0c;系统能实时检测并记录公寓的能耗状况&#xff0c;大…

可视化数据科学平台在信贷领域应用系列三:特征组合

现代各企业都提倡“降本增效”&#xff0c;所以越来越多优秀的工具诞生了。若想在特征加工这块工作上提升效率&#xff0c;建模人员也能有更多时间“偷懒”&#xff0c;都 “Sora”时代了&#xff0c;为啥不巧用工具呢&#xff1f;RapidMiner在信贷风控特征加工组合中是一把利器…

17 - 项目员工 I(高频 SQL 50 题基础版)

17 - 项目员工 I select-- round(sum(e.experience_years)/count(*),2) p.project_id,round(avg(e.experience_years),2) average_years from Project p left join Employee e on p.employee_ide.employee_id group by p.project_id;

智能座舱车载数字人解决方案,低资源占用

随着智能汽车的快速发展&#xff0c;人们对汽车的需求已经超越了单纯的交通工具定义&#xff0c;而是更加追求个性化、智能化的出行体验。在这样的背景下&#xff0c;美摄科技凭借其卓越的技术实力和创新能力&#xff0c;推出了面向企业的智能座舱车载数字人解决方案&#xff0…

Qt Creator常用的快捷键和常用功能

常用快捷键 新建项目&#xff0c;ctrl n 运行项目&#xff0c;ctrl r 构建项目&#xff0c;ctrl b 改变编辑器界面字体显示比例大小&#xff0c;ctrl 鼠标滚轮 对齐代码&#xff0c;ctrl a; ctrl i 跳转到上一行&#xff0c;ctrl shift enter 跳转到下一行&#xff0c;…

PhpStorm 2024 激活码 - JetBrains 高效智能PHP IDE

各位程序员&#xff0c;每天敲代码真的需要一款好用的 IDE&#xff0c;大名鼎鼎的 JetBrains 值得信赖&#xff01;PHP 开发看过来&#xff0c;PhpStorm 个人版首年订阅 618 限时特惠 7.1 折&#xff0c;有需要的朋友一定不要错过&#xff01; PhpStorm 汇集了众多效率功能和集…