原工程在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. apache开源项目--HttpComponents

    HttpComponents 也就是以前的httpclient项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端/服务器编程工具包,并且它支持 HTTP 协议最新的版本和建议.不 ...

  2. 服务器上的iptables

    服务器上的iptables 防火墙设置脚本规则 完整脚本如下: 复制代码代码示例: #!/bin/bash# by www.jbxue.comiptab="/sbin/iptables&qu ...

  3. linux chmod 命令详解(转)

    Ubuntu下修改目录权限需要先用 sudo 来获得管理员权限,格式如下: sudo chmod 600 ××× (只有所有者有读和写的权限)sudo chmod 644 ××× (所有者有读和写的权 ...

  4. SharePoint 2010 使用自定义aspx页面替换列表默认的新建(NewForm.aspx),查看(DispForm.aspx)和编辑(EditForm.aspx)页面

    转:http://www.cnblogs.com/sygwin/archive/2011/11/04/2236678.html 如何使用自定义的aspx页(比如Application Page)替换列 ...

  5. HDU 4237 The Rascal Triangle

    The Rascal Triangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. Codeforces 629C Famil Door and Brackets DP

    题意:给你一个由括号组成的字符串,长度为m,现在希望获得一个长度为n(全由括号组成)的字符串,0<=n-m<=2000 这个长度为n的字符串要求有两个性质:1:就是任意前缀,左括号数量大于 ...

  7. 转:maven项目添加jar包.

    很多新手都不知道如何在maven项目里添加jar包. 以前我还没接触maven的时候下载过一个demo,是maven项目. 我居然是照着他的pom.xml文件一个一个的写!!! 很多人认为理所当然的东 ...

  8. 远程调试树莓PI

    非官方 参考  http://linuxtortures.blogspot.jp/2012/06/cross-compiling-and-cross-debugging-c.html 注意: 建立 / ...

  9. 线性存储结构-LinkedList

    LinkedList内部采用链表的形式构建,是一个双向链表.除了继承List外,还继承了Deque接口,可以当做堆栈结构使用. private static final class Link<E ...

  10. Base-Android快速开发框架(二)--数据存储之SharedPreferences

    对于App开发者,抽象来说,其实就是将数据以各种各样的方式展示在用户面前以及采集用户的数据.采集用户的数据包括用户的输入.触摸.传感器等,展示的数据通过网络来源于各业务系统,以及用户的 输入数据.在这 ...