我是C编程的新手,需要帮助解决编译问题:
有3个.c文件(main.c,file1.c,file2.c)file1.c和file2.c只包含在main.c中调用的函数定义。当我尝试使用下面的命令编译我的main.c文件时,它给了我错误:
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函数。所以我在两个文件中添加了这个main函数:
int main()
{
return 1;
}
此时编译file1.c和file2.c时他们不会给我错误,但是在运行main.c时我仍然遇到相同的编译错误。在编译file1.c和file2.c之后我也不知道如何将它们链接到main.c?
有人可以帮忙。
答案 0 :(得分:4)
您需要将所有翻译单元链接在一起。也许所有人都在一次洗涤,如下:
gcc -Wall main.c file1.c file2.c
现在您有一个名为a.out
的可执行文件,可供您享受。
当然,每次更改一个文件时重建整个项目是不可行的,所以通常你要分别编译每个TU,然后在最后一步中链接所有内容(和给输出文件一个更好的名字):
gcc -Wall -c main.c
gcc -Wall -c file1.c
gcc -Wall -c file2.c
gcc -o myprog main.o file1.o file2.o
答案 1 :(得分:1)
你自己做过这方面的研究吗?网上有很多相关的例子。
您不应该在file1.c和file2.c中定义main函数。您应该使用-c选项编译所有.c文件,然后将它们链接到main,如下所示:
gcc main.o file1.o file2.o
答案 2 :(得分:0)
你可以
gcc -Wall *.c
将编译当前目录中的所有.c文件...如果将每个项目保存在单独的文件夹中,这是一个很好的快捷方式
答案 3 :(得分:0)
基本上,您有链接错误。请记住,任何程序只有一个main()函数。在您的示例中,此main()必须最终与其他文件链接以创建可执行文件。 main()是任何C程序的入口点。因此,源代码中应该只有一个main()来创建可执行文件。对于您的情况,我会说使用Makefile进行编译和链接。 makefile节省了编译时间,非常方便。
我会说 - 使用Makefile。 Makefile使工作更轻松。将来,如果必须扩展功能,请添加新文件并在makefile中添加新条目。这是最简单的makefile形式。
一旦发出make - 可执行文件名 - 将创建app。接下来,运行./app
Makefile
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