我在Linux系统上编写C代码(而不是C ++)。我正在尝试从2个.c文件和1个头文件中编译一个可执行文件:main.c,sort.c和sort.h。
main.c的第一行是:#include "sort.h"
在sort.h中,sort.c中的每个函数都像这个例子一样定义:
extern void aFunct(int param);
但是,当我尝试从main.c调用sort.c中的函数时,编译时出现以下错误:“未定义引用'aFunct'”。
如果我将#include "sort.h"
替换为#include "sort.c"
我的程序可以正常运行。但是,据我所知,这是不好的形式,我宁愿避免这种情况。谢谢你的帮助。
编辑:我正在用包含以下代码的makefile编译它:
all: index sort.o
sort.o: sort.c sort.h
gcc -Wall -g -c sort.c
index: main.c sort.o
gcc -Wall -g -o index main.c
clean:
rm index
rm sort.o
编辑:我已修复此问题。问题不是源于对C文件的误解以及它们如何链接,而是源于对makefile / gcc命令的误解。我的程序使用以下makefile:
all: index sort.o
sort.o: sort.c
gcc -Wall -g -c sort.c
index: main.c sort.o
gcc -Wall -g -o index main.c sort.o
clean:
rm sort.o
rm index
答案 0 :(得分:1)
您还应该在sort.c中包含#include“sort.h”。 你可能已经这样做了。
重要的是,您需要确保构建.c文件[main.c和sort.c]
现在这两个obj文件[main.o和sort.o]应该是链接器的输入。
根据我的猜测,你没有编译sort.c,所以链接器无法看到函数的实现。
答案 1 :(得分:0)
当您将一个源代码文件包含到其他文件(例如#include "sort.c"
)时,如果将sort.c
文件包含到同一项目的多个c文件中,则可能会遇到麻烦。但据我所知,你只需编译一个包含sort.c
的c文件......这样就行了。但是,更好地阅读一些教程,例如How to Create Multi-Module Programs