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

332nm8kg  于 11个月前  发布在  Linux
关注(0)|答案(9)|浏览(199)

我正在将应用程序从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)

sauutmhj

sauutmhj1#

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

$(LINK) -nostartfiles -g ...

字符串
关于gcc documentation

-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代码时使用。

mbyulnm0

mbyulnm02#

编译.so时必须使用-shared链接选项

zf9nrax1

zf9nrax13#

对我来说,问题是,我错误地把int main()放在一个命名空间中。确保不要这样做,否则你会得到这个恼人的链接错误。
希望这对任何人都有帮助:)

f1tvaqid

f1tvaqid4#

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

#define BOOST_TEST_MODULE <yourtestName>

字符串

t8e9dugd

t8e9dugd5#

在编译一个链接了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

xytpbqjk

xytpbqjk6#

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

xmq68pz9

xmq68pz97#

我在一个大型的CMake项目中遇到了同样的问题,在我将一些函数从一个代码文件移到另一个代码文件后,我删除了构建文件夹,重新创建并重建它。然后它工作了。
一般来说,对于突然出现的链接器错误,请尝试完全删除您的构建文件夹并首先重建。这可以保存您从尝试查找实际上根本不应该存在的错误中所遇到的头痛:可能有CMake缓存变量浮动,这些变量具有错误的值,或者某些内容被重命名但未删除,.

3ks5zfa0

3ks5zfa08#

我也遇到了同样的问题,但在FreeBSD 13.1上。
解决这个问题的方法是简单地添加:

int main()
{
}

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

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


每次我试着编译这个,编译器总是抛出与OP相同的错误。
所以我所做的就是在底部添加一个空的main()函数,然后编译代码,没有错误。

llmtgqce

llmtgqce9#

我也有/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',因为我的C++实现文件没有main()。

相关问题