crt1.o:在函数“_start”中: - Linux 中对“main”的未定义引用

crt1.o: In function `_start': - undefined reference to `main' in Linux

提问人:Blackforest 提问时间:6/20/2012 最后编辑:Blackforest 更新时间:11/16/2023 访问量:146289

问:

我正在将应用程序从 Solaris 移植到 Linux

链接的对象文件没有定义 main()。但是在 Solaris 中可以正确完成编译和链接,并生成可执行文件。在 Linux 中,我收到此错误

    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main' 

我的问题是,我不能包含新的 .c/.o 文件,因为它是一个巨大的应用程序并且已经运行多年。我怎样才能摆脱这个错误?

makefile 的代码提取:

RPCAPPN = api
LINK = cc 

    $(RPCAPPN)_server: $(RPCAPIOBJ)
            $(LINK) -g $(RPCAPIOBJ) -o $(RPCAPPN)_server $(IDALIBS) $(LIBS) $(ORALIBS) $(COMMONLIB) $(LIBAPI) $(CCLIB) $(THREADLIB) $(DBSERVERLIB) $(ENCLIB)
Linux 程序入口点 未定义引用

评论

0赞 wildplasser 6/20/2012
很简单:要么停止调用 main,要么定义一个 main(^) 为什么它在 solaris 上工作?它是否具有特殊的链接器标志(链接到共享对象?
0赞 Blackforest 6/20/2012
但 ctr1.o 是存在于 /usr/lib64 中的操作系统定义的目标文件。因此,调用 main() 是无法更改的。
0赞 Kevin Chou 4/23/2019
这要视情况而定!如果你使用 ,那么试试@serup的答案,它对我有用boost

答:

50赞 Paul R 6/20/2012 #1

尝试添加到链接器选项中,即-nostartfiles

$(LINK) -nostartfiles -g ...

gcc 文档

-nostartfiles
    Do not use the standard system startup files when linking. The standard system libraries are used normally, unless -nostdlib or -nodefaultlibs is used. 

这会导致不链接(默认情况下通常链接) - 通常仅在实现自己的代码时使用。crt1.o_start

评论

7赞 serup 10/6/2016
根据问题的不同,这并不是一个真正的解决方案 - 我在尝试制作提升测试项目时遇到了类似的问题,并且添加此标志使一切变得更糟
3赞 m4l490n 12/1/2018
这对我来说也不是一个好的解决方案。我得到:“/usr/bin/ld:警告:找不到条目符号_start;默认为 000000000004562d0“,以及使用此标志后的其他许多内容
0赞 vineeshvs 3/27/2019
@m4l490n 程序是否在此警告下工作正常?对于命令“gcc -Wall insertion_sort.c -nostartfiles -lpython2.7 -o insertion_sort”,我也收到了类似的警告“/usr/local/bin/ld:警告:找不到条目符号_start;默认为 00000000004005d0”。
29赞 user2783604 9/16/2013 #2

-shared编译.so

评论

6赞 Thomas 6/5/2014
这实际上帮助我安装了一个以前因上述错误而失败的 R 包。
2赞 gregory 6/4/2016
同意;这也帮助我解决了为SQLite编译外部函数的问题。
2赞 serup 10/6/2016 #3

当我尝试使用 boost 构建一个新的测试项目时,我得到了类似的结果,结果发现我缺少一个声明:

#define BOOST_TEST_MODULE <yourtestName>
0赞 Bastian 4/25/2019 #4

在编译一个链接了 C++ 组件的 Fortran 程序时,我得到了类似的结果。就我而言,CMake 未能检测到 Fortran 应该用于最终链接。然后返回的消息以make

[100%] Linking CXX executable myprogram
/lib/../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
make[3]: *** [myprogram] Error 1
make[2]: *** [CMakeFiles/myprogram.dir/all] Error 2
make[1]: *** [CMakeFiles/myprogram.dir/rule] Error 2
make: *** [myprogram] Error 2

解决方案是添加

set_target_properties(myprogram PROPERTIES LINKER_LANGUAGE Fortran) 

添加到 CMakeLists.txt,以便打印出:make

[100%] Linking Fortran executable myprogram
[100%] Built target myprogram
7赞 abc 8/22/2020 #5

对我来说,问题是,我错误地放入了一个命名空间。确保不要这样做,否则你会得到这个烦人的链接错误。int main()

希望这对任何人有所帮助:)

0赞 Nailuj29 3/8/2021 #6

我在创建我的 c 项目时遇到了同样的问题,我忘记保存我的 main.c 文件,所以没有 main 函数。

0赞 RL-S 7/29/2022 #7

在我将一些函数从一个代码文件移动到另一个代码文件后,我在大型项目中遇到了同样的问题。我删除了构建文件夹,重新创建了它并重新构建。然后它起作用了。CMake

通常,如果突然出现链接器错误,请尝试完全删除生成文件夹并先重新生成。这可以避免您麻烦地试图寻找实际上根本不应该存在的错误:可能存在具有错误值的缓存变量,或者某些内容被重命名而未删除,...CMake

0赞 Max Dax 10/9/2022 #8

我遇到了与 OP 相同的问题,但在 FreeBSD 13.1 上。

解决问题的只是简单地添加:

int main()
{
}

由于该文件只是一个包含定义和声明的对象文件,因此使用:.cpp

extern "C"
{
  <all definitions and declarations code goes here>
}

每次我尝试编译它时,编译器都会不断抛出与 OP 相同的错误。

因此,我所做的只是在底部添加一个空函数,然后编译代码时没有错误。main()

0赞 Carlos 11/16/2023 #9

我也有因为我在 C++ 上的实现文件没有 main()。/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o: in function _start': (.text+0x17): undefined reference to main'

评论

0赞 Ouroborus 11/18/2023
这并不能提供问题的答案。一旦你有足够的声誉,你就可以对任何帖子发表评论;相反,提供不需要提问者澄清的答案。- 从评论