【问题标题】:g++ encounters a fatal error linking to crt1.o in function __startg++ 在函数 __start 中遇到链接到 crt1.o 的致命错误
【发布时间】:2013-07-04 01:29:58
【问题描述】:

我一直在尝试编译和链接 Qt5,这意味着我一直在搞乱一些 ldconfig 并包含我不完全理解的路径默认值。我会尽力将我的问题限制在一个非常具体的问题上,因为我的首要任务是修复我的编译器。

我用过一个命令试了一下

`gcc -print-prog-name=cc1plus` -v
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.7
 /usr/include/c++/4.7/x86_64-linux-gnu
 /usr/include/c++/4.7/backward
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
 /usr/include
End of search list.

开头有一个问题,关于在搜索标题时忽略不存在的目录。不幸的是,这正是 g++ 认为寻找 crt1.o 的好主意,我认为它是某种将 main() 函数变形为可执行文件的二进制文件:

g++  -Isrc  --std=c++11 -g  -c -o src/tissuecell.o src/tissuecell.cpp
g++  -Isrc  --std=c++11 -g  -c -o src/analyze.o src/analyze.cpp
g++ -o TissueCells src/tissuecell.o src/analyze.o

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

我的编译器直到几个小时前才这样做(以前,它会编译!),我输入的“不可逆命令”想到的是一个单一的:

sudo ldconfig

谁能让我摆脱这个可怕的链接和编译问题,并从我的包含路径中删除这条讨厌的行?

您也可以回答一些让我很高兴的问题:

  • 如何查看和编辑编译器搜索包含的路径? (不是 -I)
  • 如何查看和编辑编译器搜索库的路径? (不是 -L,ld 应该能够根据需要找到库)
  • ld 与整个过程有什么关系,有没有办法通过我的 g++ 调用(例如,-rpath)向 ld 传递一些标志?

【问题讨论】:

    标签: c++ linker include ld include-path


    【解决方案1】:

    首先你可以使用“-v”选项运行gcc(g++),例如:

    echo "int main() { return 0; }" > /tmp/test.c
    gcc -v /tmp/test.c
    

    您会在输出中找到以下内容:

    --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4
    

    #include <...> search starts here:
     /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include
     /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include-fixed
     /usr/include
    
    LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../:/lib/:/usr/lib/
    

    还有很多其他的东西。

    您可以在命令前使用“strace -f”的第二个变体,grep 输出并打开模式以找出使用的位置和文件。

    【讨论】:

      【解决方案2】:

      天哪,这太尴尬了。我的问题是在放弃新版本后我没有修复我的 Makefile;该错误来自我的代码库中缺少 main() 函数。

      以下命令允许我测试我的编译器是否存在内部错误:

      echo "int main() { return 0; }" > /tmp/test.c; gcc -v /tmp/test.c
      

      我退回到我的 git 上的一个旧提交,并让我的代码编译,这很好地检查了我的编译器的健全性。

      【讨论】:

      • 接受你自己的答案!我遇到了同样的问题……嗯……这里也缺少main()。你生活,你学习——他们说:)
      猜你喜欢
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多