原工程在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. windows 7环境下配置oracle 11g 客户端

    首先要去官网上下载oracle 11客户端,(我用的是64位系统)地址: http://www.oracle.com/technetwork/database/features/instant-cli ...

  2. 学习面试题Day02

    1.Java的引用和C++的指针有什么区别? 1.类型:引用其值为地址的数据元素,Java封装了的地址,可以转成字符串查看,长度可以不必关心.C++指针是一个装地址的变量,长度一般是计算机字长,可以认 ...

  3. 使用Spring Profile和Mybatis进行多个数据源(H2和Mysql)的切换

    最近在做WebMagic的后台,遇到一个问题:后台用到了数据库,本来理想情况下是用Mysql,但是为了做到开箱即用,也整合了一个嵌入式 数据库H2.这里面就有个问题了,如何用一套代码,提供对Mysql ...

  4. [转]ubuntu zip 文件乱码解决 压缩乱码

    ubuntu zip 文件乱码解决 压缩乱码 1.1 通过unzip行命令解压,指定字符集 unzip -O CP936 xxx.zip (用GBK, GB18030也可以) 有趣的是unzip的ma ...

  5. HDU 1043 Eight BFS

    题意:就是恢复成1,2,3,4,5,6,7,8,0; 分析:暴力BFS预处理,所有路径,用康拓展开判重,O(1)打印 93ms 还是很快的 #include <iostream> #inc ...

  6. mac usb转串口 连接树莓PI

    USB 转串口是淘宝买的 http://item.taobao.com/item.htm?spm=a1z09.2.9.50.YOJBwG&id=38963495468&_u=4m1dr ...

  7. 在App里面添加App Store中App链接的解决方法

    详见stackoverflow.com/questions/433907/how-to-link-to-apps-on-the-app-store http://developer.apple.com ...

  8. #pragma once 与 #ifndef 解析(转载)

    正在入门驱动编程,遇到一个小问题,如下详细解释. 原文链接:#pragma once 与 #ifndef 解析 http://www.cnblogs.com/hokyhu/archive/2009/0 ...

  9. Leetcode OJ : Evaluate Reverse Polish Notation Stack C++ solution

    #define ADDITION '+' #define SUBSTRACTION '-' #define MULTIPLICATION '*' #define DIVISION '/' class ...

  10. MATLAB和c#混合编程实现心电图显示软件

    [在此处输入文章标题] 由于MATLAB自带的GUI平台设计的界面不是很美观而且设计过程并不是很方便,我们选择了用c#来做软件界面的实现.我们用MATLAB做信号处理封装成函数,把函数编译成dll格式 ...