原工程在VS2005下创建,后迁移到Eclipse CDT 3.3.2 + MingGW下,并增加makefile文件。

原VS2005下工程Sample,实现了对类SampleClass封装,生成Sample.dll文件。工程源码文件包括stdafx.h, stdafx.cpp, targetver.h, dllmain.cpp, Sample.def, Sample.h, Sample.cpp, SampleClass.h, SampleClass.cpp。其中stdafx.h, stdafx.cpp, targetver.h用来建立预编译头文件SampleClass.pch和预编译类型文件StdAfx.obj;dllmain.cpp, Sample.def为加载DLL入口函数文件和模块定义文件;SampleClass.h, SampleClass.cpp对类SampleClass进行了声明和定义;Sample.h, Sample.cpp则定义DLL应用程序的导出函数。

首先在Eclipse下创建工程Sample,然后利用import功能,将VS2005下原工程的*.h, *.cpp, *.def, *.txt文件导入到Sample工程中。具体操作可参考IBM Developworks的《将Visual Studio C和C++ 项目迁移到 Eclipse CDT》(http://www.ibm.com/developerworks/cn/opensource/os-ecl-vscdt/)。另需要注意到是,该链接文章中使用IDE为VC6可导出并修改makefile,而VS2005已经不提供导出makefile文件功能。

接下来,编写了makefile文件(因DLL调用编译问题,需自己添加g++ 命令)。其中实现了多文件(Sample.cpp和SampleClass.cpp)的编译链接,解决方法有两个:其一是在Sample.cpp中include “SampleClass.cpp”,作为一个文件编译;其二是在makefile中添加g++参数先分别编译两个cpp文件,再链接生成DLL。本文用到的是第二种方法。

用到的g++参数说明如下(注意g++前均为tab键非空格):

-shared参数用来创建共享库,在windows中为dll。其中要注意”-o Sample.dll Sample.o SampleClass.o”中两个.o文件都必须包含,否则报错undefined reference to `SampleClass::CheckLicense(char const*)'等;
-Wl,--out-implib 这个参数主要是生成.a这个文件;-Wl等待下一条信息进行连接,--out-implib是给连接程序ld使用的,用于创建要连接dll需要的import library;
-DFILTERPLUGIN_EXPORTS来设置宏FILTERPLUGIN_EXPORTS。编译时将手动设置FILTERPLUGIN_EXPORTS宏,这时候宏FILTERPLUGIN_API被设置成__declspec(dllexport)。这样GCC就能编译这个DLL。当从可执行文件中调用DLL时,FILTERPLUGIN_EXPORTS宏没有被设置,FILTERPLUGIN_API宏被设置成__declspec(dllimport), 它将使函数在调用范围内可见。__declspec(dllexport)和__declspec(dllimport)是用来创建DLL的宏。

如需创建exe可执行程序,需增加
Sample.exe: Sample.o Sample.dll
    g++ -o Sample.exe Sample.o -L./ -lmessage
其中-L 指定连接库路径,-lmessage (or -l message) 指定DLL的import library。
具体信息可参见Minimalist GNU for Windows的A sample DLL (http://www.mingw.org/MinGWiki/index.php/sample%20DLL?PHPSESSID=abce11154a632520eb),以及GNU make手册。

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

makefile文件如下:

CXXFLAGS =    -O2 -g -Wall -fmessage-length=0

OBJS =        Sample.o SampleClass.o dllmain.o stdafx.o

LIBS =

TARGET =    Sample.dll

$(TARGET):    $(OBJS)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)

all:    $(TARGET)

# rm for LINUX/UNIX, while del for DOS
clean:
    rm -f $(OBJS) $(TARGET)
    del *.o
    del Sample.dll

Sample.dll: Sample.o SampleClass.o
    g++ -shared -o Sample.dll Sample.o SampleClass.o -Wl,--out-implib,libmessage.a

Sample.o: Sample.cpp Sample.h SampleClass.h
    g++ -c -DFILTERPLUGIN_EXPORTS Sample.cpp   
   
SampleClass.o: SampleClass.cpp SampleClass.h
    g++ -c SampleClass.cpp

dllmain.o: dllmain.cpp Sample.h
    g++ -c dllmain.cpp

stdafx.o: stdafx.cpp stdafx.h targetver.h
    g++ -c stdafx.cpp

VS2005工程迁移到Eclipse CDT的更多相关文章

  1. 利用Eclipse CDT 阅读C/C++代码

    本文转自: https://xbgd.iteye.com/blog/1259544 常见阅读代码的工具有 , visual c++, visual studio + va(visual assista ...

  2. Eclipse+CDT+GDB调试android NDK程序(转)

    Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for ja ...

  3. Eclipse进行C/C++开发——Eclipse+CDT+MinGW的配置与使用详解

    http://hi.baidu.com/ltb6w/item/3a51f11926fda60ce75c361d Eclipse进行C/C++开发——Eclipse+CDT+MinGW的配置与使用详解 ...

  4. eclipse+cdt+minGW (C/C++ 编译)

    1. 安装Eclipse CDT 方法1: 已安装Eclipse的话,可以通过菜单Help->Install New Software,安装CDT插件. 点击ADD后 Name:CDT    L ...

  5. VS2005工程由Pocket PC 2003 SDK转为WINCE6.0 SDK的问题

    把VS2005工程有采用的Pocket PC 2003 SDK改为WINCE6.0 SDK,具体操作见链接 http://blog.csdn.net/loongembedded/article/det ...

  6. eclipse中配置c++开发环境 Eclipse + CDT + MinGW

    转自eclipse中配置c++开发环境 Eclipse + CDT + MinGW 基本框架:Eclipse + CDT + MinGW 背景知识: CDT:CDT 是完全用 Java 实现的开放源码 ...

  7. Eclipse + CDT + YAGARTO + J-Link,STM32开源开发环境搭建与调试

    Eclipse+CDT+YAGARTO+J-Li:开源开发环境搭建与调试:作者:Chongqing:邮箱:ycq.no1@163.com:文档版本:V1.0:发布日期:2014-08-04:前言:此文 ...

  8. 如何在Eclipse CDT中编译含有多个main函数的项目

    最近在杭电ACM上做题,使用的C++工具是Eclipse,但是Eclipse CDT不能同时存在多个main函数的文件,上网也搜了很多资料,但是按他们的步骤来,还是不能实现自己想要的效果.经过一下午的 ...

  9. 转: 使用MinGW + Eclipse CDT进行C++开发的配置方法

    使用MinGW + Eclipse CDT进行C++开发的配置方法 1 2 3 4 5 6 分步阅读 Eclipse作为开源的IDE,可以用来高效开发Java.C++.C等程序.本文介绍如何在Wind ...

随机推荐

  1. Android UI设计系统-android selector 开始自定义样式

    Selector的结构描述: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:a ...

  2. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.4.6

    Let $A$ and $B$ be two matrices (not necessarily of the same size). Relative to the lexicographicall ...

  3. 编程精粹:编写高质量的C语言代码———笔记一

    第一章 假想的编译程序 要记得对空语句进行处理,最好使用NULL使其明显可见 char * strcpy(char* pchTo, char* pchFrom) { char* pchStart = ...

  4. 《Nagios系统监控实践》一书出版

    本书是我的第一本译著,有此机会实属机缘巧合.虽然使用Nagios只有一年多的时间,但是作为用户,我深感其设计的简洁与高效—没有一丝多余的东西.因为工作的关系,要求对各个领域都有所了解,所以没有仔细地阅 ...

  5. codeforce 606A - Magic Spheres

    题意:a,b,c三种球,能把俩个一样的球变成另一颜色不一样的球.给你目标x,y,z,问能否经过变化至少达打目标. #include<iostream> #include<stdio. ...

  6. maven 本地setting.xml配置

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  7. Spark常用RDD操作总结

    aggregate 函数原型:aggregate(zeroValue, seqOp, combOp) seqOp相当于Map combOp相当于Reduce zeroValue是seqOp每一个par ...

  8. POJ1185 - 炮兵阵地(状态压缩DP)

    题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  9. tomcat6-7配置管理用户

    tomcat6: <?xml version='1.0' encoding='utf-8'?> <tomcat-users>   <role rolename=" ...

  10. Java for循环的几种用法详解

    本文非常适合初学Java的程序员,主要是来了解一下Java中的几种for循环用法,分析得十分详细,一起来看看. J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方 ...