未分类 · 2021年5月25日 0

gcc

[TOC]

gcc

头文件引用查看

echo 'main(){}' | arm-linux-gnueabihf-gcc -E -v -

输出:

"..."表示引号应用头文件查找位置
<...>表示尖括号引用头文件查找位置

建议自己编译头文件存放在:/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include

#include "..." search starts here:
#include <...> search starts here:
 /opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/include
 /opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/include-fixed
 /opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/../../../../arm-linux-gnueabihf/include
 /opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
End of search list.

LIBRARY_PATH表示库文件目录

COMPILER_PATH=/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/6.2.1/:/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/:/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../libexec/gcc/:/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/../../../../arm-linux-gnueabihf/bin/

LIBRARY_PATH=/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/:/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/:/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../lib/gcc/:/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/../../../../arm-linux-gnueabihf/lib/:/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/lib/:/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/

COLLECT_GCC_OPTIONS='-E' '-v' '-march=armv7-a' '-mtune=cortex-a9' '-mfloat-abi=hard' '-mfpu=vfpv3-d16' '-mthumb' '-mtls-dialect=gnu'

gcc目录总结

includepath

/usr/lib/gcc/x86_64-linux-gnu/9/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include

LIBRARY_PATH

/usr/lib/gcc/x86_64-linux-gnu/9
/usr/lib/x86_64-linux-gnu
/usr/lib
/lib/x86_64-linux-gnu
/lib

arm-linux-gcc目录总结

includepath

/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/6.2.1/include
/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/6.2.1/include-fixed
/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/include
/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include

LIBRARY_PATH

/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/6.2.1/
/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/
/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/lib/gcc/
/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/lib/
/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/
/opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/

查看程序/动态库依赖

ldd ./libfreetype.so
或者
readelf -a ./libfreetype.so |grep Shared

参数

-E

使得编译器在预处理结束时就停止编译

-M,-MM

-M:生成文件的依赖关系,同时也把一些标准库的头文件包含了进来。

-MM:生成文件的依赖关系,不包含标准库。

例:

main.c:

#include "test1.h"
#include <stdio.h>

test1.h

#include "test2.h"

test2.h

// empty

键入:gcc -M main.c

/usr/include/stdc-predef.h test1.h test2.h \
 /usr/include/stdio.h \
 /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
 /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
 /usr/include/x86_64-linux-gnu/bits/wordsize.h .....
 .....

键入:gcc -MM main.c

main.o: main.c test1.h test2.h

-MG

要求把缺失的头文件按存在对待,并且假定他们和源文件在同一目录下,必须和 ‘-M’ 选项一起用。

上述环境下,删除test2.h文件,gcc -M main.c报错,找不到test2.h。改成gcc -M -MG main.c

-MF

将-M或者-MM结果打印到文件中。

例:gcc -M -MF test.txt main.c

-MD -MMD

-MD:功能类似于-M -MF <filename>,但是不会阻止编译

-MMD:功能类似于-MM -MF <filename>,但是不会阻止编译

  • 例1:

gcc -E -o test.i -MD main.c

生成test.i test.d

  • 例2:

gcc -S -o test.s -MD main.c

生成test.s test.d

  • 例3:

gcc -c -o test.o -MD main.c

生成test.o test.d

-fmessage-length=0

默认情况下,gnu工具链编译过程中,控制台输出的一行信息是不换行的,这样,当输出信息过长时(如编译错误时的信息),会导致你无法看到完整的输出信息,加入-fmessage-length=0后,输出信息会根据控制台的宽度自动换行,这样就能看全输出信息了。