Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序编译错误:引用main_C_Gcc - Fatal编程技术网

C程序编译错误:引用main

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:

我是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:
  _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