• VS2005工程迁移到Eclipse CDT


    原工程在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

  • 相关阅读:
    指针与数组
    深入函数
    到底是使用指针还是引用 ,混合使用以及易错点
    返回值作为标志
    c++的引用(二)
    内联函数
    c++的引用
    指针总结以及常量指针与指向常量的指针与指向常量的常指针
    c++中的 堆和栈
    Java Messages Synchronous and Asynchronous
  • 原文地址:https://www.cnblogs.com/pegasus923/p/1860893.html
Copyright © 2020-2023  润新知