提问人:Blackforest 提问时间:6/20/2012 最后编辑:Blackforest 更新时间:11/16/2023 访问量:146289
crt1.o:在函数“_start”中: - Linux 中对“main”的未定义引用
crt1.o: In function `_start': - undefined reference to `main' in Linux
问:
我正在将应用程序从 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)
答:
尝试添加到链接器选项中,即-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
评论
-shared
编译.so
评论
当我尝试使用 boost 构建一个新的测试项目时,我得到了类似的结果,结果发现我缺少一个声明:
#define BOOST_TEST_MODULE <yourtestName>
在编译一个链接了 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
对我来说,问题是,我错误地放入了一个命名空间。确保不要这样做,否则你会得到这个烦人的链接错误。int main()
希望这对任何人有所帮助:)
我在创建我的 c 项目时遇到了同样的问题,我忘记保存我的 main.c 文件,所以没有 main 函数。
在我将一些函数从一个代码文件移动到另一个代码文件后,我在大型项目中遇到了同样的问题。我删除了构建文件夹,重新创建了它并重新构建。然后它起作用了。CMake
通常,如果突然出现链接器错误,请尝试完全删除生成文件夹并先重新生成。这可以避免您麻烦地试图寻找实际上根本不应该存在的错误:可能存在具有错误值的缓存变量,或者某些内容被重命名而未删除,...CMake
我遇到了与 OP 相同的问题,但在 FreeBSD 13.1 上。
解决问题的只是简单地添加:
int main()
{
}
由于该文件只是一个包含定义和声明的对象文件,因此使用:.cpp
extern "C"
{
<all definitions and declarations code goes here>
}
每次我尝试编译它时,编译器都会不断抛出与 OP 相同的错误。
因此,我所做的只是在底部添加一个空函数,然后编译代码时没有错误。main()
我也有因为我在 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'
评论
boost