Eclipse cdt mingw配置记录

本人下载的是Eclipse C/C++ IDE for Neon.3,下载页面是:http://www.eclipse.org/cdt/downloads.php。

1. 运行eclipse后,在Help中打开Install New Software,在列表中可以找到“……/cdt/release/9.2/r”,然后选择要安装的项目,其实对列表中内容是不大了解细节的,所以就全部选择了。

2. 下载MinGW Installer并运行后,可以选择全部项目安装,也可以去掉“mingw32-gcc-ada”和“mingw32-gcc-fortran”两项。

完成后在系统环境配置里的path项中添加mingw的bin目录路径。

3. eclipse打开windows->Preferences->C/C++->New C/C++ Project wizard,把几个project的Toolchains选择成MingGW GCC后点,点“Make toolchain preferred”。

再选择之 下的Makefile project,选中PE Windows Parse。

--- 其它 ----------------------------------------------------

1. 如果存在第三方开发库需要调用,可以把h文件或者.a文件等复制到代码目录,也可在工程属性中进行配置。

(1)Include文件配置:Project->Properties->C/C++ Build->Settings->GCC C++ Compiler和GCC C Compiler中的Includes中,添加额外的include目录。

(2)Lib配置:Project->Properties->C/C++ Build->Settings->MingGW C++ Linker中的Libraries中,下方“-L”添加额外的lib目录,上方“-l”添加所使用的lib库名称。

2. 如果是比较通用的开发库,不想在每次项目建立后配置include和lib目录,可以在eclipse的环境配置中进行配置。

打开Window->Preferences->C/C++->Build->Environment,添加以下的变量:

(1)CPLUS_INCLUDE_PATH:值为对应的include目录路径

(1)C_INCLUDE_PATH:值为对应的include目录路径

(1)LIBRARY_PATH:值为对应的.a目录路径

3. 如果要调用VC生成的DLL文件,需要生成.a文件才可以使用。也有人说mingw4.6.2中lib和vc的lib是通用的,待确认。

VC调用mingw生成的DLL也是一样,要生成lib文件来调用。

生成.a文件可以使用reimp、pexports、dlltool等工具,参考以下命令:

(1)制作def
    调用 pexports mylib.dll | sed "s/_//" > mylib.def (sed部分去除函数名前的_)

(2)生成a
    需要mylib.dll和mylib.def
    dlltool -U -D mylib.dll -d mylib.def -l libmylib.a (注意,这个-U绝对不能少)

    这样就会生成库文件libmylib.a文件。

(3)通过a调用dll

--- 某些错误 ----------------------------------------------------

1. 提示undefined reference to winmain@16这样的提示的,需要在项目属性的Linker的Libraries中添加mingw32库,并且顺序放在最前面。

 

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

MinGW 下使用和创建 DLL 倒是要特别注意,问题主要集中在 g++ 编译器(C++ 的 GNU 版本编译器)对于 DLL 的函数输入以及 输出的名称修饰、调用协议上和 VC 编译器是有很大区别的。 

1、MinGW 如何使用一个标准的 DLL。这里标准 DLL 指的是采用 __stdcall 调用协议、并且导出函数名称干干净净, 没有函数名尾部的 @nn、没有函数名头部的下划线的。MinGW 的 g++ 程序中,对于需要从 DLL 中导入的函数,声明时必须要用 extern "C", 但不要用 __declspec(dllimport),虽然 g++ 支持,但是一旦你使用,则 g++ 在链接时会自动强制在需要导入的函数名前加 _imp__ 前缀, 导致链接时找不到函数名错误。所以,我们其实完全不需要用 __declspec(dllimport)。另一方面,gcc/g++ 编译器遇到代码中 __stdcall 修饰的函数名, 会自动将其函数名在链接时设置为函数名@nn,nn 是函数参数栈字节数。
另外,gcc/g++ 编译器/链接器在链接时其实不需要 DLL 的导入库(import lib), 因为它们可以直接从 DLL 链接,这样更加方便,省去了很多从 DLL 如何生成符合格式要求的 .a 导入库等问题。 只需要在 gcc/g++ 参数中加入 -Wl,--enable-stdcall-fixup -L../../Bin/ -lDLL文件名(不含.dll)即可直接从 DLL 文件本身完成链接。 这里要注意,-Wl参数指示 g++ 链接器需要采用后面的链接控制参数(以逗号分隔),--enable-stdcall-fixup 告诉 g++ 链接器需要导入的 DLL 函数 的名字需要自动在尾部加上 @nn 格式的后缀,以便符合 gcc/g++ 对 __stdcall 函数名的扩展规范。-L 指定 DLL 文件所在目录, -l 指定 DLL 文件名称,不带 .dll。如果不加 --enable-stdcall-fixup,gcc/g++ 总是会报链接错误, 因为 gcc/g++ 将代码中需要从 DLL 导入的函数名后面都强制加了 @nn,但是 DLL 中的函数名不带 @nn, 没有 --enable-stdcall-fixup,很有可能就会出错。即时不出错,也会有很多警告,很有可能会导致程序 crash! 注,在 NetBeans CDT 中,-Wl,--enable-stdcall-fixup -L -l 这样的参数在链接器参数设置中指定。
2、MinGW 如何创建一个标准的 DLL。MinGW 中创建标准 DLL,应该使用 __declspec(dllexport), 包括 extern "C" 等都是和 VC 一样的。但要注意,这样编译链接生成的 DLL,导出的函数名尾部都带有 @nn, 为了要去除它们,必须在链接器参数设置中使用 -Wl,--kill-at,它告诉链接器创建 DLL 时导出的函数名尾部不要带有 @nn。 注,在 NetBeans CDT 中,上面这个参数同样是在链接器参数设置中指定。
综上,如果创建一个 DLL,同时这个 DLL 又需要导入其他 DLL 的函数,参数就可以统一为 -Wl,--kill-at,--enable-stdcall-fixup -L -l 这样了,很方便。

posted @ 2017-06-30 12:47  蓝马  阅读(401)  评论(0编辑  收藏  举报