现在的位置: 首页 > 综合 > 正文

Cygwin GCC 的 Makefile 工程在 Eclipse CDT 中配置符号与路径自动发现方法

2013年10月03日 ⁄ 综合 ⁄ 共 2358字 ⁄ 字号 评论关闭

首先使用 MinGW GCC 工具集的工程不存在这个问题:

CDT 可以很好的发现安装的 MinGW 工具集,然后使 MinGW GCC 的 Toolchain 激活,使其在新建 C/C++ 工程时成为可选的,这样就可以使用 CDT 自己的生成器产生 makefile。符号与路径自动发现没有问题,源码符号索引(source index)也没有问题。

符号与路径自动发现:指的是 C/C++ 程序中根据编译环境的差异,会在几个缺省的路径下查找 .h 文件和库文件,通常标准/RT 库的头文件和库文件就放到那里,所以源码中用 #include <stdio.h> 就可以直接找到并包含指定的头文件,不用指定标准头文件 stdio.h 的路径。另外,编译器会产生内置的宏符号,比如 C++ 编译器通常都产生 __cplusplus 宏,内置宏的定义和具体的编译器关系很大,比如,Cygwin GCC 就有 __CYGWIN__、__GNUC__ 等标识自己编译环境的宏。

而 Cygwin GCC 的问题恰恰出现在这里,CDT 不能发现 Cygwin 工具集的安装,这跟版本有关:早期的 Cygwin 也能被 CDT 自动发现,并激活 Cygwin GCC 的 Toolchain 选项。可是我用的 Cygwin setup 2.680,已经不能被 CDT(Eclipse 3.4.1,CDT 5.0.1)自动发现了。Cygwin 版本变化对安装设置最明显的改变是:变动了标识 Cygwin 安装的注册表键,而 CDT 就是靠注册表来发现 Cygwin、MinGW 等工具集的安装的。从这个 nabble.com 上的帖子可以看出点端倪。

 

我也不想搞注册表了,只好做 Makefile 类型的 CDT 工程,手头上还有些自己以前写的 makefile,改改就能用,工程在大一点就用 autotools 得了。

哪曾知要让 Makefile 型工程也能使用 CDT 的符号索引,也要费劲脑汁配置一番。

原因还是上面的问题,CDT 不知道 Cygwin 的存在,所以像 #include <stdio.h> 这句在建立符号索引时就会错(CDT 会表现出波浪的下滑线,并说明:unresolved inclusion),因为 CDT 找不到 stdio.h,看看生成过程中符号与路径自动发现的结果,在工程 Properties→C/C++ General→Paths and Symbols 中,就明白了——什么缺省 include 路径和内置宏都没发现(勾选 Show built-in values)。

当然 CDT 的符号索引和编译生成过程无关,Cygwin GCC 正常编译、生成程序,只是在编辑时 CDT 的源码浏览功能削弱了,原本强悍的源码符号索引 IDE 现在只成了一个高亮语法显示工具。

几经折腾后,发现了配置 Makefile 型工程使用 CDT 符号与路径自动发现的方法,步骤如下:

  1. 工程 Properties→C/C++ Build→Discovery Options 中设置 Discovery profiles scope 为 Configuration-wide(如果没有就新建这个),注意把下面配置中的 Automate discovery of paths and symbols 勾上,这个就影响工程 Properties 中的 C/C++ General→Paths and Symbols 中的 include 路径和宏符号的自动发现。

  2. 把 Discovery profile 选择为 GCC per project scanner info profile,和它平行的是很多 Managed Build System 前缀的 profile。

    Managed Build System 的 profile 对应于 CDT 内建的 make 生成器(叫做 CDT Internal Builder)使用的路径/符号自动发现设置。而使用 Cygwin 提供的外部 make 工具的方式称为:Gnu Make Builder,这两种 builder(生成器)在工程 Properties→C/C++ Build→Tool Chain Editor 能找到线索。

  3. 特别注意:如果你在 Discovery Options 中把 Compiler invocation command 设置为 gcc 或 g++,可能会出错,而这是 CDT 帮你填的默认编译命令(黑线……),原因是 Cygwin 中 gcc 和 g++ 可能是个符号链接,只有用 Cygwin 系统/库构造起来的程序才认识到这是个符号链接,否则 Windows 的程序,包括 CDT 就只当它是个文本文件(用 16 进制编辑器看看 Cygwin 的 ln 创建的符号链接文件的内容就明白了),此时把一个文本文件当程序运行当然会出错。解决办法就是找到 gcc/g++ 符号链接指向的实际目标编译器程序,通常是 gcc-4.exe、g++-4.exe 等(4 是版本号,视具体情况而定),下来只要设定 gcc-4/g++-4 为编译命令就行了。

  4. 最后重编译你的工程,CDT 就会使用 Discovery Options 设定的 gcc 做缺省 include 路径和内置宏发现(方法是对一个空的源文件做 -E 预处理展开)。现在你可以看看工程 Properties→C/C++ General→Paths and Symbols 中被 CDT 自动发现的 include 路径和宏符号了。再看看源码中的 #include <stdio.h> 标准头文件包含,现在也已经自动发现了这些标准头文件的位置了。最后,你可就以按着 Ctrl 键享受 CDT 强大的源码符号跳转了,那是比 VC IntelliSense,VC + Visual Assist X,Source Insight 等精确地多的源码符号索引,更何况 CDT 是开源的。

用了这种方法写C代码就可以有提示功能了……

抱歉!评论已关闭.