C链接错误:对'main'的引用未定义。

49
我正在尝试将几个C程序链接在一起,但是我得到了一个错误的响应:
$ gcc -o runexp.o scd.o data_proc.o -lm -fopenmp
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
make: * [runexp] Error 1

我只有一个主要功能,就是在runexp中。表单如下:
int main(void) {
    ...; 
    return 0;
}

为什么会出现这个错误?

1
这个函数是在全局作用域吗? - Ivaylo Strandjev
4
你的GCC命令中没有包括runexp.c文件,它的输出结果是runexp.o文件。你确定已经将包含主方法的源代码文件加入其中了吗? - Morten Jensen
5个回答

37

-o选项后提供输出文件名。在您的情况下,runexp.o被视为输出文件名,而不是输入目标文件,因此您的main函数未定义。


4
或者只需删除-o选项并使用传统的./a.out,这是一个美丽的名称 ;) - Tomasz Gandor

11

在编译时您没有包含包含main()函数的C文件,因此链接器无法找到它。

您需要将其添加进去:

$ gcc -o runexp runexp.c scd.o data_proc.o -lm -fopenmp

4
您正在使用此命令覆盖您的对象文件runexp.o
 gcc -o runexp.o scd.o data_proc.o -lm -fopenmp

事实上,-o 是用于指定输出文件的选项。你需要运行以下命令:
gcc -o runexp.out runexp.o scd.o data_proc.o -lm -fopenmp

runexp.out 将是你的二进制文件。


2

通常情况下,您可以按照以下方式编译大多数.c文件:

gcc foo.c -o foo。具体可能因所使用的#include或是否有外部.h文件而异。通常,当您拥有一个C文件时,它看起来有点像以下内容:

#include <stdio.h>
    /* any other includes, prototypes, struct delcarations... */
    int main(){
    */ code */
}

当我遇到“undefined reference to main”错误时,通常意味着我的.c文件中没有int main()。如果你最初学习的是Java,这种混淆是可以理解的,因为在Java中,你的代码通常看起来像下面这样:

//any import statements you have
public class Foo{
    int main(){}
 }

我建议你检查代码顶部是否有int main()

0

ld链接器错误:C++中未定义对`main'的引用

我知道这个问题是关于C语言的,但如果你碰巧在编译C++(就像我的情况一样),那可能是因为你把main()函数放在了一个命名空间内。将其移到命名空间外部即可解决此错误!

例如:

will_not_run.cpp:

#include <iostream>

// <========== comment out the namespace (this lines plus the opening and 
// closing braces) to make this program link!
namespace my_module
{

int main()
{
    std::cout << "hello world!\n\n";

    return 0;
}

} // namespace my_module

如果你尝试使用这个命令进行构建和运行:
time g++ -Wall -Wextra -Werror -O3 -std=gnu++17 will_not_run.cpp \
    -o will_not_run && will_not_run

如果您这样做,将会出现以下错误:

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status

为解决此问题,只需删除命名空间或将main()移出命名空间即可使其再次正常工作!
#include <iostream>

int main()
{
    std::cout << "hello world!\n\n";

    return 0;
}

所以,如果你需要在main()函数内访问你的my_module命名空间,只需明确地使用它,如my_module::my_func()或者在你想要访问你的命名空间内容的任何作用域中调用using namespace my_module;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接