Contents

gcc

常用命令

如下命令常用与排查交叉编译相关问题

# readelf命令用于查看ELF文件中的符号表和版本信息,属于binutils包的一部分
readelf -sV /lib/aarch64-linux-gnu/libc.so.6 |grep mesa
    36: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mesa_memcpy@GLIBC_2.17 (2)
    41: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mesa_memmove@GLIBC_2.17 (2)
	51: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mesa_memset@GLIBC_2.17 (2)
	
# 查看gcc编译器的库文件搜索路径
/usr/bin/aarch64-linux-gnu-g++-8 --sysroot=/mnt/kylinOS -print-search-dirs

# 使用 strings 查看libc库最高支持的版本
strings $(/usr/bin/aarch64-linux-gnu-g++-8 -print-file-name=libc.so.6) | grep GLIBC_

# 我们可以通过gcc的 `-print-file-name=libc.so.6` 的选项来查看编译器内部自带的动态库路径
# 找到编译器对应的 libc.so 路径
/usr/bin/aarch64-linux-gnu-g++-8 -print-file-name=libc.so.6

问题引入:

void test(int) {
}

int main() {
    return 0;
}

上面的这代代码在Ubuntu20中使用默认gcc版本是无法编译通过的。会报如下错误:

main.c: In function ‘test’:
main.c:2:11: error: parameter name omitted
2 | void test(int)
| ^~~

c2x 标准之前的c标准中,是不允许忽略掉参数名称的。这一点和c++ 不同。这个特性是在 c2x 中才引入的。

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 11 --slave /usr/bin/g++ g++ /usr/bin/g++-11

 sudo update-alternatives --config gcc