C链接错误:未定义对“main”的引用

jhiyze9q  于 2023-03-17  发布在  其他
关注(0)|答案(5)|浏览(269)

我已经阅读了关于这个主题的其他答案,但不幸的是,它们对我没有帮助。我试图将几个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

我只有一个main函数,它在runexp中,形式是

int main(void) {
    ...; 
    return 0;
}

有什么想法,为什么我可能会得到这个错误?谢谢!

w6mmgewl

w6mmgewl1#

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

knsnq2tg

knsnq2tg2#

编译时没有包括包含main()的C文件,因此链接器看不到它。
您需要添加它:

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

e37o9pze3#

您正在通过运行以下命令覆盖目标文件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将是二进制文件。

sq1bmfud

sq1bmfud4#

通常,您可以按以下方式编译大多数.c文件:
gcc foo.c -o foo。它可能会根据您使用的#includes或您是否有任何外部.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()

polhcujo

polhcujo5#

ld个链接器错误:C++中的undefined reference tomain'`:

我知道这个问题是关于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()或其他名称,或者在您希望访问main()函数内部命名空间内容的任何作用域中调用using namespace my_module;

相关问题