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

Posted

技术标签:

【中文标题】如何编译链接到不同files.o的源文件的多个实例【英文标题】:how to compile multiple instances of a source file linking to it different files.o 【发布时间】:2012-04-02 01:43:58 【问题描述】:

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

图形解释为:

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

全部: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: error: ‘graph’ undeclared (第一次在这个函数中使用)

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

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

grafi_test.c:21: error: ‘G’ undeclared (第一次在这个函数中使用)

make: * [test_matrice] 错误 1


谢谢,乔治

【问题讨论】:

您的意思是不制作两个file_test.c 的副本,还是不制作两个可执行文件(例如file_test_onefile_test_two)?你会接受一个真正解决你问题的答案吗? 我的意思是不复制两份file_test.c 【参考方案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 有什么看法?

【讨论】:

我正在做类似的事情,但我遇到了一些错误。我认为编译器没有看到测试程序中使用的某些方法,而是在 files.o 中定义的。o 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 @Buzz,这个makefile适用于我的C++(我的C已经生锈了)。你能告诉我们错误信息吗? gcc grafi_test.c grafi_matrice.o -o test_matrice grafi_test.c:3: 错误:预期'='、','、';'、'asm'或'属性' before '*' token grafi_test.c: In function 'main': grafi_test.c:20: error: 'graph' undeclared (first use in this function) grafi_test.c:20: error: (每个未声明的标识符都是只报告一次 grafi_test.c:20: error: 对于它出现的每个函数。) grafi_test.c:20: error: 'G' undeclared (first use in this function) make: *** [test_matrice] Error 1跨度> 我在问题正文中发布了 makefile 和输出,因此它更具可读性:)【参考方案2】:

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

如果您提供了如何为 file_one.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 @Buzz:a) 没有任何换行符,makefile 几乎不可能读取(可能将其编辑为原始问题?),以及 b) 需要替换哪些文件制作第二个版本?

以上是关于如何编译链接到不同files.o的源文件的多个实例的主要内容,如果未能解决你的问题,请参考以下文章

如何快速确认代码是否被编译链接

MySQL编译安装多实例

如何将多个不同的InputStream链接到一个InputStream中

如何Ubuntu配置多个交叉编译工具??

gcc编译器使用简明指南 (特别是多个文件如何进行编译)

如何增量计算上传到多个服务器实例的文件的“sha256”?