48

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

6 回答 6

48

尝试添加-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代码时使用。

于 2012-06-20T10:41:21.003 回答
26

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

于 2013-09-16T10:33:58.323 回答
4

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

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

于 2020-08-21T18:56:01.853 回答
2

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

#define BOOST_TEST_MODULE <yourtestName>
于 2016-10-06T07:07:52.530 回答
0

在编译链接了 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
于 2019-04-25T08:57:33.193 回答
0

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

于 2021-03-07T19:32:15.097 回答