LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 931|回复: 6

求助:带外部变量的两个源文件怎么编译不通?

[复制链接]
发表于 2006-5-10 13:50:14 | 显示全部楼层 |阅读模式
错误提示:
make -f makefile.mk
gcc -c f.c
gcc -c c.c
gcc f.o c.o -o s
c.o(.text+0x0): In function `main':
: multiple definition of `main'
f.o(.text+0x0): first defined here
/usr/bin/ld: Warning: size of symbol `main' changed from 117 in f.o to 51 in c.ocollect2: ld returned 1 exit status
make: *** 错误 1

makefile:
s:f.o c.o h.o
        gcc f.o c.o -o s
f.o:f.c h.h
        gcc -c f.c
c.o:c.c h.h
        gcc -c c.c

c.c源文件:
#include "h.h"
main()
{
extern gnum[5];

printf("gnum=%s/n",gnum);
}

f.c源文件
#include "h.h"
#include <arpa/inet.h>
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

char gnum[5];

main()
{
pid_t pid;
gnum[0]='a';
gnum[1]='b';
gnum[2]='c';
gnum[3]='d';
if((pid=vfork())<0)
printf("vfork success...\n");

/*child*/
if(pid==0)
{
execl("/var/tmp/c.o","c.o",(char *)0);

}
}

h.h源文件
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
发表于 2006-5-11 12:59:03 | 显示全部楼层
你有俩main函数,你希望连接器使用哪个呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-11 13:48:12 | 显示全部楼层
他们是两个独立的不同源文件的程序,只不过c由f通过vfork——execl启动,所以这两文件都有main函数。启动的时候也只是同时运行的两个进程而已。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-11 13:48:54 | 显示全部楼层
他们是两个独立的不同源文件的程序,只不过c由f通过vfork——execl启动,所以这两文件都有main函数。启动的时候也只是同时运行的两个进程而已。
回复 支持 反对

使用道具 举报

发表于 2006-5-11 13:54:53 | 显示全部楼层
Post by wangne

gcc -c f.c
gcc -c c.c
gcc f.o c.o -o s

你这样分明想把两个带有main函数的.o文件link成一个executable,而不是创建两个独立的程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-11 14:24:46 | 显示全部楼层
上面的前辈说得对,我是才学的makefile,编这个程序的本意是要达到通过f.c启动c.c并在其两个进程之间通信的目的。我想用外部变量的方法进行简单的通信,在没有编写makefile之前先用gcc将他们逐一的编译了一通:
gcc -g -o f  f.c
gcc -g -o c  c.c
f.c编译成功但c.c却出现错误:
/tmp/ccYHk2QP.o(.text+0x20): In function `main':
/root/c.c:6: undefined reference to `gnum'
collect2: ld returned 1 exit status

因此才想用makefile看能不能成功。

另外前辈你能不能教我编写在这种情况下的makefile?多谢多谢。
回复 支持 反对

使用道具 举报

发表于 2006-5-11 14:54:34 | 显示全部楼层
这好像不是makefile的问题,还是c语言常识性问题

1、两个进程间是不能通过这种方法共享变量的

2、你有外部变量,就必须有一个文件里定义这个变量,在这个文件里这变量不是外部的
否则链接时就会undefined reference to `gnum'
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表