如何编译链接到不同files.o的源文件的多个实例

时间:2012-03-16 13:56:01

标签: c compiler-construction linker makefile

我有两个files.c,它们包含相同的方法(相同的名称和参数),但实现方式不同,以提供独立于实现的方法。如何生成单个测试文件并使用这两个实现进行编译而不会出现部署错误?

graraphically Explained是:

file_one.c(file_two.c的相同方法名称和参数)

file_two.c

file_test.c

我想:

编译 - > file_test.c file_one.c

编译 - > file_test.c file_two.c

在makefile中没有制作file_test.c的两个副本


CC = gcc

CFLAGS = -c -Wall

all:test_matrice test_lista

test_matrice:grafi_test.c grafi_matrice.o

       $(CC) grafi_test.c grafi_matrice.o -o test_matrice 

test_lista:grafi_test.c grafi_liste.o

       $(CC) grafi_test.c grafi_liste.o -o test_lista 

grafi_matrice.o:grafi_matrice.c grafi_matrice.h

       $(CC) $(CFLAGS) grafi_matrice.c 

grafi_liste.o:grafi_liste.c grafi_liste.h

       $(CC) $(CFLAGS) grafi_liste.c 

clean:rm -rf * .o test_matrice test_lista


我收到此错误:

gcc grafi_test.c grafi_matrice.o -o test_matrice

grafi_test.c:4:错误:在'*'标记之前预期'=',',',';','asm'或'属性'

grafi_test.c:在函数'main'中:

grafi_test.c:21:错误:'graph'unclaclared(首次在此函数中使用)

grafi_test.c:21:错误:(每个未声明的标识符仅报告一次

grafi_test.c:21:错误:对于它出现的每个函数。)

grafi_test.c:21:错误:'G'未声明(首次使用此功能)

make: * [test_matrice]错误1


谢谢,Giorgio

2 个答案:

答案 0 :(得分:1)

编写一个makefile来为file_one.c生成所需的结果;复制进行编译的行,并编辑它以使用file_two.c并为创建的可执行文件使用不同的名称。

如果您提供了如何为file_one.c创建结果的示例,我可能会更具体。

答案 1 :(得分:1)

这样做:

file_test_%: file_test.c file_%.c
    $(CC) $^ -o $@

如果您愿意,可以添加默认规则:

all: file_test_one file_test_two

修改
麻烦在于你的声明。如果您在grafi_matrice.c中有这样的功能:

void graph(int n)
  {
      ...
  }

然后像grafi_test.c这样的另一个文件中的代码不能简单地调用它。编译器尝试编译grafi_test.c,到达行graph(3)并说“ graph()?我对此一无所知。”你必须至少在grafi_test.c(电话上方)中有一个声明,如下所示:

void graph(int);

处理此问题的常用方法是使用标题文件,但可以等待。

修改:
编译器仍然对graph一无所知。您必须了解声明,否则您将无法取得成功。首先,grafi_matrice.cgraph的评价是什么?