我正在将应用程序从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)
答案 0 :(得分:31)
尝试将-nostartfiles
添加到链接器选项,即
$(LINK) -nostartfiles -g ...
-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
代码时使用。
答案 1 :(得分:22)
-shared
时,必须使用 .so
链接选项
答案 2 :(得分:2)
当我尝试使用boost构建一个新的测试项目时,我得到了类似的结果,结果发现我错过了一个声明:
#define BOOST_TEST_MODULE <yourtestName>
答案 3 :(得分: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
答案 4 :(得分:0)
对我来说,问题是,我错误地将int main()
放在了命名空间中。确保不要这样做,否则会收到此烦人的链接错误。
希望这对任何人都可以帮助:)
答案 5 :(得分:0)
我在创建我的 c 项目时遇到了同样的问题,我忘记保存我的 main.c 文件,所以没有 main 函数。