Linux下使用gcc编译时出现In function `_start':(.text+0x**) :分析与解决

使用 gcc编译是出现如下问题:

  

In function `_start':(.text+0x****): undefined reference to `main'....

   例如:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void test()
{
    char* str = (char*)malloc(100);
    strcpy(str,"hello");
     //free(str);
     if(str != NULL)
     {
          strcpy(str, "world");
     }
     printf("%s",str);
}
int main(int argc, char *argv[])
{
    test();
    return 0;
}

 
编写对应的makefile文件:

test:test.c
       gcc-g -o test test.c

 
编译时会出现如下error:

/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start':
(.text+0xc): undefined reference to `__libc_csu_fini'
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start':
(.text+0x11): undefined reference to `__libc_csu_init'
collect2: ld returned 1 exit status
make: *** [test] Error 1

 
这是没有使用了共享库,没有链接,添加了-shared选项之后,即可:

gcc -shared -g -o test test.c

这个错误通常出现在Linux环境下使用GCC编译C/C++程序的时候。它表明链接阶段出错,具体是因为找不到`main`函数。 ### 原因分析 1. **缺少主函数** 每个完整的C/C++程序都需要一个入口点——即`main`函数。如果源代码文件中没有提供`main`函数,链接器会报此错误。 2. **拼写错误** 如果你不小心将`main`写成了其他名字(例如`maim`),那么尽管你写了类似入口的函数,但它不会被视为有效的程序起点。 3. **未包含正确的源文件** 当你在项目中有多个源文件,并且忘记把定义了`main`函数的那个文件传递给编译器时,也会导致这个问题。 4. **尝试编译非独立模块** 编译一些库或其他不需要完整应用程序结构的部分时,也可能误用命令行选项而导致该问题发生。 --- ### 解决方案 #### 一、检查是否定义了`main` 确保你的代码里有如下的标准形式之一: ```c int main() { ... } ``` 或者带参数的形式: ```c int main(int argc, char *argv[]) { ... } ``` #### 二、验证所有必要源文件均已加入构建过程 如果你正在处理一个多文件项目,请确认每个`.c``.cpp`文件都传给了gcc/g++命令。比如: ```bash gcc file1.c file2.c -o myprogram ``` 这里假设`file1.c`中含有`main()``file2.c`包含了其它支持功能;两者缺一不可! #### 三、避免对单独函数做无谓链接 对于那些并非旨在成为整个可执行体的小型组件单元测试等场景下运行“gcc foo.o”之类的指令前加上适当的标志位告诉工具链我们只需要汇编生成目标码即可无需寻找启动例程: ```shell gcc -c your_source_file.c # 这只会创建object file 而不做最终linking操作. ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值