make: *** [configure-target-libgcc] Error 1
GCCæºç çæ¬: GCC 4.6.2,误源
æ¬å°GCCç¼è¯å¨çæ¬ï¼gcc (GCC) 4.6.3 (Fedora)
ç¼è¯é ç½®ï¼ ../gcc-4.6.1/configure --target=$TARGET--prefix=$PREFIX --without-headers --enable-languages=c --disable-threads --disable-decimal-float --with-newlib --disable-shared--disable-libmudflap --disable-libssp
#-----------------------------------#
ä½ æ³å®è£ çæ¯ 4.6.2 è¿æ¯4.6.1ï¼
什么意思c语言程序编程 undefined reference to ?
最近在Linux下编程发现一个诡异的现象,就是误源在链接一个静态库的时候总是报错,类似下面这样的误源错误:
(。text+0x): undefined reference to `func'
关于undefined reference这样的误源金龙算法公式源码问题,大家其实经常会遇到,误源在此,误源我以详细地示例给出常见错误的误源各种原因以及解决方法,希望对初学者有所帮助。误源
1。误源 链接时缺失了相关目标文件(。误源o)
测试代码如下:
然后编译。误源
gcc -c test。误源c
gcc –c main。误源c
得到两个 。o 文件,一个是 main。o,一个是 test。o ,然后我们链接 。
o 得到可执行程序:
gcc -o main main。o
这时,你会发现,报错了:
main。o: In function `main':
main。c:(。text+0x7): undefined reference to `test'
collect2: ld returned 1 exit status
这就是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件,本例中test。
o文件中包含了test()函数的私服php源码实现,所以如果按下面这种方式链接就没事了。
gcc -o main main。o test。o
扩展:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报undefined reference错,其实底层原因与上面是一样的。
gcc -o main main。c //缺少test()的实现文件
需要改成如下形式才能成功,将test()函数的实现文件一起编译。
gcc -o main main。c test。c //ok,没问题了
2。 链接时缺少相关的库文件(。
a/。so)
在此,只举个静态库的例子,假设源码如下。
先把test。c编译成静态库(。a)文件
gcc -c test。c
ar -rc test。a test。o
至此,我们得到了test。a文件。我们开始编译main。
c
gcc -c main。c
这时,则生成了main。o文件,网易rem源码然后我们再通过如下命令进行链接希望得到可执行程序。
gcc -o main main。o
你会发现,编译器报错了:
/tmp/ccCPAl。o: In function `main':
main。
c:(。text+0x7): undefined reference to `test'
collect2: ld returned 1 exit status
其根本原因也是找不到test()函数的实现文件,由于该test()函数的实现在test。
a这个静态库中的,故在链接的时候需要在其后加入test。a这个库,链接命令修改为如下形式即可。
gcc -o main main。o 。/test。a //注:。/ 是给出了test。a的路径
扩展:同样,为了把问题说清楚,上面我们把代码的编译链接分开了,如果希望一次性生成可执行程序,则可以对main。
c和test。a执行如下命令。
gcc -o main main。c 。/test。a //同样,如果不加test。a也会报错
3。 链接的股票ma源码库文件中又使用了另一个库文件
这种问题比较隐蔽,也是我最近遇到的与网上大家讨论的不同的问题,举例说明如下,首先,还是看看测试代码。
从上图可以看出,main。c调用了test。c的函数,test。c中又调用了fun。c的函数。
首先,我们先对fun。c,test。c,main。c进行编译,生成 。o文件。
gcc -c func。c
gcc -c test。
c
gcc -c main。c
然后,将test。c和func。c各自打包成为静态库文件。
ar –rc func。a func。o
ar –rc test。a test。股票规律源码o
这时,我们准备将main。o链接为可执行程序,由于我们的main。
c中包含了对test()的调用,因此,应该在链接时将test。a作为我们的库文件,链接命令如下。
gcc -o main main。o test。a
这时,编译器仍然会报错,如下:
test。a(test。o): In function `test':
test。
c:(。text+0x): undefined reference to `func'
collect2: ld returned 1 exit status
就是说,链接的时候,发现我们的test。a调用了func()函数,找不到对应的实现。
由此我们发现,原来我们还需要将test。a所引用到的库文件也加进来才能成功链接,因此命令如下。
gcc -o main main。o test。a func。a
ok,这样就可以成功得到最终的程序了。同样,如果我们的库或者程序中引用了第三方库(如pthread。
a)则同样在链接的时候需要给出第三方库的路径和库文件,否则就会得到undefined reference的错误。
GCC 源码编译安装
前言
本文主要介绍如何在特定条件下,通过源码编译安装GCC(GNU Compiler Collection)4.8.5版本。在Linux环境下,特别是遇到较老工程代码和低版本GCC适配问题时,网络仓库不可用,可通过下载源码进行本地编译安装。文章总结了该过程的步骤,以期帮助读者解决类似需求。
Linux系统版本:SUSE Linux Enterprise Server SP5 (aarch) - Kernel \r (\l)
GCC版本:gcc-4.8.5
步骤如下:
1,源码下载
直接在Linux终端执行:wget ftp.gnu.org/gnu/gcc/gcc...
或手动下载:ftp://gcc.gnu.org/pub/gcc/infrastructure
选取对应的gcc版本下载。
2,解压并进入目录
解压下载的tar包:tar -jxvf gcc-4.8.5.tar.bz2
进入解压后的目录:cd gcc-4.8.5
3,配置依赖库
联网情况下:cd gcc-4.8.5/
./contrib/download_prerequisites
无法联网时,手动下载依赖库(如mpfr、gmp、mpc)并上传到指定目录,然后分别解压、重命名并链接。
4,创建编译存放目录
在gcc-4.8.5目录下执行:mkdir gcc-build-4.8.5
5,生成Makefile文件
cd gcc-build-4.8.5
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
推荐配置时,根据环境调整参数,如X_环境下的`--disable-libsanitizer`。
6,执行编译
make(可能耗时较长)
解决可能出现的问题,如libc_name_p和struct ucontext uc,通过参考gcc.gnu.org/git或直接覆盖相关文件。
7,安装GCC
在gcc-build-4.8.5目录下执行:make install
安装完成后,可直接解压并安装。
8,配置环境变量
执行命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/gcc-4.8.5/mpc:/root/gcc-4.8.5/gmp:/root/gcc-4.8.5/mpfr
确保路径一致,执行 source /etc/profile 使环境变量生效。
9,检查安装情况
通过`gcc -v`和`g++ -v`验证GCC版本。
,库升级
遇到动态库未找到问题时,需升级gcc库,通过查找和替换最新库文件解决。
,卸载系统自带的gcc
以root用户执行:rpm -qa |grep gcc | xargs rpm -e --nodeps
,修改ld.so.conf文件
编辑文件:vi /etc/ld.so.conf,在最下面添加实际路径,如/usr/local/lib和/usr/local/lib。
执行 ldconfig /etc/ld.so.conf。
,修改GCC链接
确保GCC及其相关工具的正确链接,使用`ll /usr/bin/gcc*`和`ll /usr/bin/g++*`检查链接结果。
至此,GCC源码编译安装流程完成,可满足特定环境下的GCC版本需求。
为什么GCC、GLIBC、libstdc++ not found?
GLIBCXX not found
相关报错处理方式:
1. 需要确认所使用的库文件是否存在于系统中,通常通过运行 `ldd` 命令查看程序依赖的动态库。如果出现类似`/usr/lib/libstdc++.so.6: version 'GLIBCXX_3.4.' not found (required by ./xxx)`的错误信息,说明缺少特定版本的GLIBCXX库。
处理方法如下:
2. **源码编译更新gcc
**3. **下载官方包复制
**4. **手动编译复制
**GLIBC not found
相关错误信息示例:
若报错信息为`/lib/libc.so.6: version 'GLIBC_2.' not found (required by /lib/libstdc++.so.6)`,则表明缺少特定版本的GLIBC库。
处理方法有以下几种:
2. **源码编译更新gcc
**3. **下载官方包复制
**4. **手动编译复制
**gcc
gcc 是 GNU Compiler Collection 的简称,用于将c/c++源代码编译为不同操作系统平台的汇编代码和可执行程序。
gcc 是一组编译工具的集合,主要负责预处理和编译任务,自动调用汇编器和链接器,提供与编译器紧密相关的运行库支持。
glibc
glibc 是 GNU 实现的标准 C 库,提供操作系统级的底层函数和核心API,如I/O设备操作。
glibc 包含多个头文件,每个文件定义一组相关设施。
libstdc++
libstdc++ 类似于 glibc,但针对 C++ 标准库。
提供与标准 C 库相同的核心定义和底层功能,以及 C++ 标准库的实现,用于实现 C++ 程序中的库内容,如线程、流、文件、输入/输出等。
大多数 Linux 发行版默认使用 libstdc++。
ABI
标准库的一个关键方面是 Application Binary Interface (ABI),它确保了编写的 C 程序能在不同版本的 glibc 上运行。
为了改进而不破坏兼容性,glibc 使用符号版本控制,每个函数与特定版本关联,允许新版本的程序使用新符号,而旧版本的程序仍能使用旧但兼容的符号。
binutils 是将汇编语言翻译为目标代码的程序,与标准库之间存在密切关系。
GNU C 函数库为开发者提供了便利,便于使用 C 语言开发基于 Linux 操作系统的程序。
glibc 是 Linux 下的 C 标准库实现,是 GNU C Library 的一部分,已成为 Linux 的主要 C 库之一。
相关命令
使用 `ldd` 命令查看程序依赖的动态库。
通过 `strings /lib/libc.so.6 | grep GLIBC_` 查看系统 GLIBC 支持的版本。
通过 `strings /usr/lib/libstdc++.so.6 | grep GLIBCXX` 查看系统 GLIBCXX 支持的版本。
使用 `readelf` 命令可以检查应用程序或库所需的 GLIBC 或 GLIBCXX 版本。
gcc编译问题
gcc编译失败的可能原因及解决方案 一、原因及解决方案概述 在使用gcc进行编译时,可能会遇到多种问题。常见的问题包括语法错误、链接错误、库文件缺失等。针对这些问题,我们需要仔细检查源代码、编译命令以及环境配置,确保无误后才能成功编译。 二、详细解释 1. 语法错误:这是编译器在解析源代码时最常见的问题。可能是由于使用了错误的语法、关键字使用不当、括号不匹配等原因造成。这种情况下,gcc会给出具体的错误提示,根据提示检查并修改源代码即可。 2. 链接错误:在编译过程中,链接器可能会找不到之前定义的函数或变量。这通常是因为函数或变量的声明与定义不匹配,或者文件路径设置不正确等。解决这类问题需要检查函数和变量的声明和定义是否一致,并确保所有依赖的文件都被正确包含。 3. 库文件缺失:某些程序需要依赖特定的库文件才能编译成功。如果缺少这些库文件,gcc会报错。解决这类问题通常需要安装缺失的库文件,或者通过编译选项指定库文件的路径。 三、解决方案实施建议 针对以上问题,我们可以采取以下措施: 1. 仔细阅读错误提示:gcc的错误提示非常详细,包含了错误类型和具体位置,这是解决问题的关键。 2. 检查源代码:根据错误提示检查源代码,特别是错误发生的位置附近,看是否存在语法错误、变量声明与定义不匹配等问题。 3. 确认库文件:确保所有依赖的库文件都已正确安装,并且路径设置正确。 4. 使用正确的编译命令:确保编译命令包含了所有必要的文件和选项。 四、总结 解决gcc编译问题需要我们仔细分析和理解错误提示,检查源代码和环境配置,确保一切正确后再进行编译。遇到问题不要慌张,逐一排查,往往能很快找到解决方案。2024-11-30 18:32
2024-11-30 18:16
2024-11-30 16:54
2024-11-30 16:50
2024-11-30 16:11