【问题标题】:crt1.o: In function `_start': - undefined reference to `main' in Linuxcrt1.o:在函数“_start”中:- Linux 中未定义对“main”的引用
【发布时间】:2012-06-22 09:40:43
【问题描述】:

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

【问题讨论】:

  • 简单:要么停止调用main,要么定义一个main(^) 为什么它在solaris 上有效?它是否有特殊的链接器标志(链接到共享对象?)
  • 但 ctr1.o 是操作系统定义的对象文件,存在于 /usr/lib64 中。因此调用 main() 不能改变。
  • 视情况而定!如果你使用boost,那么试试@serup 的answer,它对我有用

标签: linux main undefined-reference


【解决方案1】:

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

【讨论】:

  • 取决于问题,那么这不是一个真正的解决方案 - 我在尝试制作 boost 测试项目时遇到了类似的问题,添加此标志会使一切变得更糟
  • 这对我来说也不是一个好的解决方案。我得到:“/usr/bin/ld:警告:找不到条目符号_start;使用此标志后默认为 00000000004562d0”以及其他许多内容
  • @m4l490n 程序是否可以正常处理此警告?对于命令“gcc -Wall insert_sort.c -nostartfiles -lpython2.7 -o insert_sort”,我也收到了类似的警告“/usr/local/bin/ld: warning: cannot find entry symbol _start; 默认为 00000000004005d0”。
【解决方案2】:

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

【讨论】:

  • 这实际上帮助我安装了一个以前因上述错误而失败的 R 包。
  • 同意;这也帮助我解决了为 sqlite 编译外部函数的问题。
【解决方案3】:

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

#define BOOST_TEST_MODULE <yourtestName>

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案5】:

      我的问题是,我错误地将int main() 放在了命名空间中。确保不要这样做,否则你会收到这个烦人的链接错误。

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2017-11-29
          • 1970-01-01
          • 2020-03-25
          • 2021-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多