zoukankan      html  css  js  c++  java
  • linux下带有CDT的Eclipse的helloworld编译错误的解决方法

    啊哈!!!!!!!!!!!!!!!!!!!!!

    终于把这个问题给解决了,困扰了我一个晚上!!!!!害得我在节假日里没有电影看。万恶的Eclipse!!!

    现在冷静下来,重新审视一下刚才尝试的所有过程。

    首先,我的OS是Fedora14,因为希望使用IDE,所以选择使用Eclipse。

    其次,因为Unix上的多数开发是C、C++,所以选择CDT。于是,在http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/helios/SR2/eclipse-cpp-helios-SR2-linux-gtk.tar.gz  下载到已经带有CDT的Eclipse.

    然后,回到Fedora之后,感觉原来在装系统时使用的Eclipse是个冗余。所以使用了系统工具中的“添加、删除软件”将所有和Eclipse有关的东西全部删除了。

    之后,我就自己解压缩(tar -zxvf)刚才下载得Eclipse。因为在安装Fedora的时候已经选择了编程套件,所以JDK是已经安装好了。然后就可以启动Eclipse了。

    然后,使用IDE新建一个样板hello world.编译——悲剧发生了,

    代码如下:(应该没有问题)
    #include 
    <iostream>
    using namespace std;

    int main() {
    cout 
    << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
    }

    具体错误是:
    **** Build of configuration Debug for project a ****

    make all  
    Building file: ..
    /src/a.cpp
    Invoking: GCC C
    ++ Compiler
    g
    ++ -O0 -g3 -Wall --fmessage-length=0 -MMD -MP -MF"src/a.d" -MT"src/a.d" -o"src/a.o" "../src/a.cpp"
    cc1plus: 错误:要生成依赖项,您必须指定 
    -M 或 -MM
    make: 
    *** [src/a.o] 错误 1

    先把解决方法写出来,如果有兴趣看我是怎么尝试的过程的话,可以继续往下看。

    解决方法:“Project——Property——c/c++ buider——settings“。然后在GCC C++ Compiler(如果是c的hello world,应该修改GCC C Compiler)里,修改Optimization和Debugger里面下拉框中的参数,果然在将Debugger的-g3改为-g之后奇迹出现了!!

    那是无语啊,网上找了很多,都是驴头不对马嘴的。没办法,自己想办法!!

    1. 尝试Eclipse里的“Project——Property——c/c++ buider——settings“。然后在GCC C++ Compiler(如果是c的hello world,应该修改GCC C Compiler)里,发现只有Optimization和Debugger里面可以增减gcc的参数。于是在两个里面选择一个,增加"-M"

    2. 重新编译。编译通过了!但是链接出错了。

    **** Build of configuration Debug for project test ****

    make all 
    Building file: ..
    /src/test.cpp
    Invoking: GCC C
    ++ Compiler
    g
    ++ -O0 -g3 --Wall --fmessage-length=0 -MMD -MP -MF"src/test.d" -MT"src/test.d" -o"src/test.o" "../src/test.cpp"
    Finished building: ..
    /src/test.cpp
     
    Building target: test
    Invoking: GCC C
    ++ Linker
    g
    ++  -o"test"  ./src/test.o   
    .
    /src/test.o: file not recognized: File truncated
    collect2: ld 返回 
    1
    make: 
    *** [test] 错误 1

    3. 无语啊,然后开始继续baidu,发现没有人有这个问题!!

    4. 于是发现-M是不对的,那么行。俺就来-MM!还是回到了2的结果。

    5. 怎么办??我查到了一份GCC中文手册。发现-M,-MM,-MD,-MMD是预处理选项。而且文档中说这四个选项其实很类似,只是在实现细节上有差别。仔细看了Eclipse给出的gcc的参数,发现是有-MMD的。也就是说,很有可能是因为其他原因造成的,而不是提示所说的缺少-M或者-MM!

    6. 这里有一个细节,我一直在使用debug,那么如果编译成release会怎么样?ok.试一下。给力通过了!

    7. 回忆一下,问题可能在哪里?release没错,debug有错,再想一下release与debug的区别在哪里。悟了!是优化和调试代码!那么问题应该是出现在表示优化的-O参数或者表示debug的-g参数上?再去“Project——Property——c/c++ buider——settings“。然后在GCC C++ Compiler(如果是c的hello world,应该修改GCC C Compiler)里,修改Optimization和Debugger里面下拉框中的参数,果然在将Debugger的-g3改为-g之后奇迹出现了!!

    总体来说,如果仔细去研究一下gcc的参数就可以发现一些蛛丝马迹。

    -MD
    和`-M'选项类似,但是把依赖信息输出在文档中,文档名通过把输出文档名末尾的
    `.o'替换为 `.d'产生.同时继续指定的编译工作---`-MD'不象`-M'那样阻止正常的编译任务.
    Mach的实用工具`md'能够合并`.d'文档,产生适用于`make'命令的单一的 依赖文档.
    -MMD 和`-MD'选项类似,但是输出结果仅涉及用户头文档,忽略系统头文档.

    然后再看一下出现了link错误的时候的出错信息。好像说.o文件不完整。那么就可能会想到时debugger选项的问题了,因为指定过-MD或-MMD之后,"文档名通过把输出文档名末尾的`.o'替换为 `.d'产生" .也许解决问题的关键就在这里吧。

    ------------------------------------------------------------------------

    email : aicrosoft1104@126.com

    吃遍天下。

     

  • 相关阅读:
    PHP ftp_rmdir() 函数
    PHP ftp_rename() 函数
    PHP ftp_rawlist() 函数
    PHP ftp_raw() 函数
    PHP ftp_pwd() 函数
    PHP ftp_put() 函数
    PHP ftp_pasv() 函数
    PHP ftp_nlist() 函数
    PHP ftp_nb_get() 函数
    PHP ftp_nb_fget() 函数
  • 原文地址:https://www.cnblogs.com/aicro/p/2004931.html
Copyright © 2011-2022 走看看