linux下C语言编译问题

tuohaijun 2008-05-10 11:15:46
各位:
我在编译一个c程序时,系统提示:
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
我是在虚拟机上安装的fedora 7
以上错误信息是什么意思哪?
该如何解决,请大家指教,不胜感谢。
...全文
808 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
geldqb 2008-05-30
  • 打赏
  • 举报
回复
就是把main函数前后的#if, #endif 去掉
geldqb 2008-05-30
  • 打赏
  • 举报
回复
先把main函数的条件编译控制去掉,试试看行不行。
genser 2008-05-12
  • 打赏
  • 举报
回复
感觉好像是你哪里的头文件没有包含的样子
tuohaijun 2008-05-11
  • 打赏
  • 举报
回复
在tca_init()里面
刘光伟 2008-05-11
  • 打赏
  • 举报
回复
你的main放在那个文件里面?
jufeng2309 2008-05-11
  • 打赏
  • 举报
回复
感觉还是编译时的文件依赖没写好。
链接时找不到目标文件。
tuohaijun 2008-05-11
  • 打赏
  • 举报
回复
程序中的makefile文件如下:(我对这个了解很有限,看了一些资料还是没太明白)
EXE_NAME =mynetlink

CC = gcc
#CFLAGS = -g -O2 -L./lib -lpthread -lcrypt -lssl -lmysqlclient -DDEBUG
CFLAGS = -g -O2 -DDEBUG

SRCS = conntrack.c \
libnetfilter_conntrack.c \
libnetfilter_conntrack_icmp.c \
libnetfilter_conntrack_ipv4.c\
libnetfilter_conntrack_ipv6.c \
libnetfilter_conntrack_tcp.c \
libnetfilter_conntrack_udp.c \
libnfnetlink.c \
tca_init.c \
tca_db.c \
tca_mac_ip.c \
tca_mempool.c \
tca_save.c

INCS = -I./include -I/usr/include -I/usr/local/mysql/include/mysql -lpthread -L./lib -lcrypt -lssl

OBJS = $(SRCS:%.cc=%.o)

all:$(EXE_NAME)

$(EXE_NAME):$(OBJS)
# $(CC) $(CFLAGS) $(INCS) $(OBJS) $(LIBS) libmysqlclient.a -o $(EXE_NAME)
$(CC) $(CFLAGS) $(INCS) $(OBJS) $(LIBS) libmysqlclient.a libz.a -o $(EXE_NAME)

$(OBJS): ${@:.o=.cc}
$(CC) $(CFLAGS) $(INCS) -o $@ -c $?

clean:
(rm -fr *.o $(EXE_NAME) )
刘光伟 2008-05-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tuohaijun 的回复:]
我已经把main()函数贴出来了,程序中确实存在main()函数,我怎么才能知道我的main函数有没有包括的工程里哪?
是不是makefile文件写得有问题。
[/Quote]
这样看了应该就是makefile文件的问题了,看下是不是没有编译这个main文件,或是编译了没有连接
tuohaijun 2008-05-11
  • 打赏
  • 举报
回复
我已经把main()函数贴出来了,程序中确实存在main()函数,我怎么才能知道我的main函数有没有包括的工程里哪?
是不是makefile文件写得有问题。
tuohaijun 2008-05-11
  • 打赏
  • 举报
回复
这个程序时我的毕业设计,代码是老师给的,要求先看懂编译通过后再作些修改,代码很多,我不知道该贴出那部分,但是有个文件中确实存在main()函数,
其代码如下:
int main(int argc,char *argv[])
{
int n;

openlog("WiseOS_NETLINK",LOG_NOWAIT,LOG_LOCAL0);
memset(&statistic[IN],0,sizeof(STATISTIC));
memset(&statistic[OUT],0,sizeof(STATISTIC));
memset(&run_info,0,sizeof(RUN_INFO));
memset( &if_record, 0, sizeof(IF_RECORD) ); /* 清除临时接口数据结构*/
memset( &last_second, 0, sizeof(struct timeval) );
memset( &last_5minutes, 0, sizeof(struct timeval) );
syslog(LOG_DEBUG, "WiseOS_NETLINK Start-----------------------\n");
if(argc==3)
{
strcpy(run_info.if_name,argv[1]);
if(argv[2][0]=='0')
run_info.position=WAN;
else
run_info.position=LAN;
}
n = mkdir(MSGDIR, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
if(n<0 && errno!=EEXIST)
{
syslog(LOG_DEBUG, "临时目录创建失败!\n");
exit(0);
}
mkdir(INFODIR, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
/*初始化数据结构*/
db_init(); /* 测试数据库是否存在*/
mq_init(); /* 消息队列创建/获得,同时向sc进程注册*/
run_init(); /* 运行参数,从sc得到网络端口配置信息*/
signal_init(); /* 异常信号处理,程序退出*/
mac_table_init(); /* mac-ip对应表*/
//modified 2007
conn_table_init();
n = mempool_init();
if( n < 0 ) //内存池
{
printf("内存池初始化失败!\n");
exit(0);
}
syslog( LOG_DEBUG, "内存池支持%d个连接!\n", n );
//end modified 2007
save_message_init();
if((n=thread_start())<0) //启动线程
{
syslog(LOG_DEBUG, "%d线程启动失败!\n",n);
//modified 2007
mempool_free();
//end modified 2007
exit(0);
}
/* 启动定时任务*/
// (void) signal( SIGALRM, Signalhandler ); /* handler with TM(1second) */
// alarm( (unsigned int) TIMER_INT ); /* 1 second */
syslog(LOG_DEBUG, "WiseOS_NETLINK Init Finished, Enter Message Loop----------\n");
msg_loop();
return 1;
}
#endif

void exit_srv(int signo)
{
int i;
time_t ti;

pthread_cancel(trace_id);
pthread_cancel(save_id);
pthread_cancel(clean_id);
sleep(1);

FILE *fp=fopen(INFODIR"/down.info","a");
if(fp!=NULL)
{
ti=time(NULL);
fprintf(fp,"SIGNAL %d KILL ME !!! ------ %s\n",signo,ctime(&ti));
fclose(fp);
}
//modified 2007
mempool_free();
//end modified 2007
mac_table_free();

syslog(LOG_DEBUG, "SIGNAL %d KILL ME !!! STOP.\n",signo);
exit(0);
}
air_snake 2008-05-11
  • 打赏
  • 举报
回复
从你贴的main的代码来看,main函数的编译是有条件的,你好像没有贴全的,你的main函数后面有#endif,说明前面还是有定义的,你仔细看看,应该是你的configure文件有定义一些宏定义的头,configure的时候你没有定义,然后生成的Makefile就不会把main编译进去的。
个人认为是这样,你在仔细看看吧。

如果这样,看看在main前的是什么宏,然后再configure里面找,找到后执行./configure 宏=y 之类的,具体要自己看了。
cceczjxy 2008-05-11
  • 打赏
  • 举报
回复
应该是没有main函数
geldqb 2008-05-11
  • 打赏
  • 举报
回复
(可执行文件的情况下)GCC(其实是ld)在链接的时候,会自动找crt1.o文件,
该文件下有一个用汇编语言写成的_start函数,
该函数是程序执行的入口,
在该函数里面,
会有一条汇编指令,
这条汇编指令呼出你所编写的main函数.

你可以objdump命令来查看crt1.o文件进行反汇编编译以后的汇编源文件.


所以,你的main函数是不是没有写,或者没有包括到工程里面去.
jufeng2309 2008-05-11
  • 打赏
  • 举报
回复
贴出部分源码,我看看
Soulic 2008-05-11
  • 打赏
  • 举报
回复
因该是你的文件里没定义main函数吧

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧