C程序编译错误:引用main
我是C编程新手,需要帮助解决编译问题: 有3个.c文件(main.c、file1.c、file2.c)file1.c和file2.c只包含在main.c中调用的函数定义。当我试图使用下面的命令编译我的主.c文件时,它给出了错误:C程序编译错误:引用main,c,gcc,C,Gcc,我是C编程新手,需要帮助解决编译问题: 有3个.c文件(main.c、file1.c、file2.c)file1.c和file2.c只包含在main.c中调用的函数定义。当我试图使用下面的命令编译我的主.c文件时,它给出了错误: gcc -Wall ./trigger-solve/main.c _approx_help", referenced from: _print_help in main-9e2c6e.o "_approximate", referenced from:
gcc -Wall ./trigger-solve/main.c
_approx_help", referenced from:
_print_help in main-9e2c6e.o
"_approximate", referenced from:
_main in main-9e2c6e.o
"_free_matrix", referenced from:
_main in main-9e2c6e.o
"_print_matrix", referenced from:
_main in main-9e2c6e.o
"_read_matrix", referenced from:
_main in main-9e2c6e.o
"_read_sparse_matrix", referenced from:
_main in main-9e2c6e.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
然而,在阅读了有关此错误的内容后,我发现它的发生是因为file1.c和file2.c不包含main函数。因此,我在两个文件中都添加了此主要函数:
int main()
{
return 1;
}
此时,当我编译file1.c和file2.c时,它们不会给我错误,但是在运行main.c时,我仍然会得到相同的编译错误。另外,我不知道在编译完file1.c和file2.c之后,我应该如何将它们链接到main.c
有人能帮忙吗。您需要将所有翻译单元链接在一起。也许是一次洗完,像这样:
gcc -Wall main.c file1.c file2.c
现在您有了一个名为a.out
的可执行文件,可供您使用
当然,每次更改一个文件时都要重建整个项目是不可行的,因此通常要分别编译每个TU,然后在最后一步中链接所有内容(并为输出文件提供更好的名称):
你自己做过这方面的研究吗?网上有很多相关的例子 您不应该在file1.c和file2.c中定义main函数。您应该使用-c选项编译所有.c文件,然后将它们链接到main,如下所示: gcc main.o file1.o file2.o您可以
gcc -Wall *.c
将编译当前目录中的所有.c文件。。。这是一个很好的快捷方式,如果您将每个项目都保存在一个单独的文件夹中基本上,您会遇到链接错误。记住,任何程序只有一个main()函数。在您的示例中,此main()最后必须与其他文件链接以创建可执行文件。main()是任何C程序的入口点。因此,为了创建可执行文件,源代码中应该只有一个main()。对于您的情况,我会说使用Makefile进行编译和链接。makefile节省了编译时间,而且非常方便 我会说-使用Makefile。Makefile使工作更容易。将来,如果必须扩展该功能,请添加一个新文件并在makefile中添加一个新条目。这是这里最简单的makefile形式 一旦你发布make,将创建可执行文件名app。接下来,运行./app 生成文件
target = file1.0 file2.o main.o
[tab] gcc file1.o file2.o main.o -o app
file1.o: file1.c
[tab] gcc -c file1.c -o file1.o
file2.o: file2.c
[tab] gcc -c file2.c -o file2.o
main.o: main.c
[tab] gcc -c main.c -o main.o
现在,运行Makefile
$make target
您的错误消息是clang,但问题被标记为gcc,并且您编写的命令使用gcc。你真正使用的是哪种编译器?你能显示你用来编译的所有命令吗?@DavidGrayson有些系统带有
gcc
作为clang
的符号链接。(不要问我为什么)也应该总共只有一个main
函数,而不是每个单元一个。
$make target