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 -c -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. 重新编译。编译通过了!但是链接出错了。
make all
Building file: ../src/test.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -M -Wall -c -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
吃遍天下。