欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    从windows到unix移植from IBM论坛Word文档格式.docx

    • 资源ID:20087508       资源大小:47.50KB        全文页数:28页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    从windows到unix移植from IBM论坛Word文档格式.docx

    1、 #define PRINT_API _declspec(dllimport)#endifextern C PRINT_API void printHello();清单 2 提供了 hello.cpp 的源代码。清单 2. 文件 hello.cpp#include #include hello.hvoid printHello std:cout using namespace std;typedef void* (*funcPtr)();# define IMPORT_DIRECTIVE _attribute_(_visibility_(# define CALL # define IMPOR

    2、T_DIRECTIVE _declspec(dllimport) # define CALL _stdcall IMPORT_DIRECTIVE void* CALL LoadLibraryA(const char* sLibName); IMPORT_DIRECTIVE funcPtr CALL GetProcAddress( void* hModule, const char* lpProcName); IMPORT_DIRECTIVE bool CALL FreeLibrary(void* hLib);main 方法现在显式地加载 printHello.dll 文件,并调用相同的 pri

    3、nt 方法,如所示清单 7 中所示。清单 7. 主文件 Loadlib.cpploadlib.hint main(int argc, char* argv) #ifndef UNIX char* fileName = hello.dll void* libraryHandle = LoadLibraryA(fileName); if (libraryHandle = NULL) cout dll not found endl; else / make a call to printHello from the hello.dll (GetProcAddress(libraryHandle, )

    4、(); FreeLibrary(libraryHandle);#else / unix void (*voidfnc)();hello.so void* libraryHandle = dlopen(fileName, RTLD_LAZY);shared object not found from the hello.so voidfnc = (void (*)()dlsym(libraryHandle, ); (*voidfnc)(); dlclose(libraryHandle);Windows 和 UNIX 环境中的 DLL 搜索路径在 Windows 操作系统中,按照下面的顺序搜索 D

    5、LL:1. 可执行文件所处的目录(例如,notepad.exe 位于 Windows 目录中) 2. 当前工作目录(即,从哪个目录启动了 notepad.exe。) 3. Windows 系统目录(通常为 C:WindowsSystem32) 4. Windows 目录(通常为 C:Windows) 5. 作为 PATH 环境变量中的一部分所列举的目录 在类 UNIX 系统中,如 Solaris,LD_LIBRARY_PATH 环境变量可以指定共享库搜索顺序。指向一个新的共享库的路径需要追加到 LD_LIBRARY_PATH 变量末尾。HP-UX 的搜索顺序包括作为 LD_LIBRARY_PA

    6、TH 的一部分所列举的目录,然后是 SHLIB_PATH 中列举的目录。对于 IBM AIX 操作系统,由 LIBPATH 变量确定共享库搜索顺序。将静态库从 Windows 移植到 UNIX 与动态库不同,在编译应用程序时对静态库的目标代码进行连接,并且因此成为该应用程序的一部分。在 UNIX 系统中,静态库遵循一种命名规范,使用 lib 作为前缀,而使用 .a 作为库名的后缀。例如在 UNIX 系统中,Windows 的 user.lib 文件通常被命名为 libuser.a。操作系统提供的命令 ar 和 ranlib 可用于创建静态库。清单 8 说明了如何从 user_sqrt1.cpp

    7、 和 user_log1.cpp 源文件创建一个静态库 libuser.a。清单 8. 在 UNIX 环境中创建静态库g+ -o user_sqrt1.o -c user_sqrt1.cpp g+ -o user_log1.o -c user_log1.cppar rc libuser.a user_sqrt1.o user_log1.o ranlib libuser.aar 工具创建了静态库 libuser.a,并将 user_sqrt1.o 和 user_log1.o 目标文件的副本放置于其中。如果存在一个现有的库文件,那么将目标文件添加到其中。如果所使用的目标文件比库中的文件更新一些,那

    8、么则替换旧的目标文件。r 标志表示使用相同目标文件的更新版本替换库中旧的目标文件。如果这个库并不存在,那么 c 选项将创建这个库。在创建了一个新的存档文件,或者修改了一个现有的存档文件之后,需要创建存档文件内容的索引,并将其作为该存档文件的一部分进行存储。这个索引列出了存档文件的成员(可重定位目标文件)所定义的每个符号。该索引可以提高与静态库进行连接的速度,并允许调用库中的例程,而不考虑它们在库中的实际位置。请注意,GNU ranlib 是 ar 工具的扩展,并且使用 s 参数调用 ar,ar -s 与调用 ranlib 具有相同的效果。预编译头文件在 Visual C+ 中,基于 C/C+

    9、的应用程序通常会使用预编译头文件。预编译头文件是某些编译器(如 Visual Studio 中的 cl)的一项性能特性,它可以帮助提高编译的速度。复杂的应用程序通常会使用头文件(.h 或者 .hpp)文件,它们是需要作为一部分进行包括的一个或多个源文件的代码部分。在一个项目的范围内,很少对头文件进行修改。因此,为了提高编译的速度,可以将这些文件转换为一种编译器更容易理解的中间形式,以便提高后续编译工作的速度。在 Visual Studio 环境中,这种中间形式称为预编译头文件或者 PCH。考虑本文前面清单 1 和 2 中包括 hello.cpp 的示例。其中包含了 iostream 和 EXP

    10、ORT_API 宏的定义,在该项目的范围内,这些可以被看作是该文件中不变的代码部分。因此,它们适合放在一个头文件中进行包含。清单 9 显示了可能会发生相关更改的代码。清单 9. precomp.h 的内容#ifndef _PRECOMP_H#define _PRECOMP_H# if defined (_GNUC_) &# define EXPORT_API _attribute_(_visibility_(# elif defined WIN32# define EXPORT_API _declspec(dllexport) # endif清单 10 显示了 DLL 的源代码,其中包括相关的

    11、更改。清单 10. 新的 hello.cpp 文件的内容precomp.h#pragma hdrstop EXPORT_API void printHello()hello Windows/UNIX usersendl;正如其名称所表示的,预编译头文件在 头中止 (header stop) 点之前,以一种经过编译的形式包含目标代码。源文件中的这个点通常由一个词素进行标记,而预处理程序不会使用该词素作为一个语言符号,这表示它并不是一项预处理程序指令。或者,还可以将这个头中止点指定为 #pragma hdrstop,如果在源文本中,它出现在一个有效的非预处理程序语言关键字之前。在 Solaris

    12、中进行编译时,当碰到 #include 时,将搜索预编译头文件。在搜索包含文件的过程中,编译器首先在每个目录中查找预编译头文件,然后再在这些目录中搜索包含文件。需要搜索的名称可以在带 .gch 的 #include 中进行指定。如果无法使用这个预编译头文件,那么将忽略它。下面的命令行可用于在 Windows 中实现预编译头文件功能:cl /Yc precomp.h hello.cpp /DWIN32 /LD/Yc 通知 cl 编译器从 precomp.h 生成预编译头文件。可以使用下面的命令在 Solaris 中实现相同的功能:g+ precomp.hg+ -fPIC -G hello.cpp

    13、 -o hello.so第一个命令创建了预编译头文件 precomp.h.gch。剩下的生成共享对象的过程与本文前面所描述的相同。注意:g+ 版本 3.4 及更高的版本提供了对预编译头文件的支持。结束语在两个完全不同的系统之间(如 Windows 和 UNIX)进行移植,绝不是一项简单的任务,并且它需要大量的调整工作和耐心。本文说明了将最基本的项目类型从 Visual Studio 环境移植到基于 g+/Solaris 环境的基本要素。第二篇文章作为本系列文章的总结,将介绍 Visual Studio 环境及其 g+ 等价物中各种可用的编译器选项、g+ 属性机制、从 32 位(通常是指 Win

    14、dows)环境移植到 64 位(UNIX)环境时的一些问题,以及多线程等等。第二部分比较和对照相关的编译器选项Visual C+ 和 GNU g+ 都为 cl 编译器提供了一些选项。尽管您可以使用 cl 作为独立的工具进行编译工作,但是,Visual C+ 提供了一种灵活的集成开发环境 (IDE) 以设置编译器选项。使用 Visual Studio 开发的软件通常使用了一些编辑器特定的和平台相关的特性,可以使用编译器或者连接器来控制这些特性。当您在不同的平台(使用了不同的编译器或者工具链)之间移植源代码的时候,了解编译器的相关选项,这一点是非常重要的。这部分内容深入分析了一些最有价值的编译器选

    15、项。启用字符串池可以考虑下面的代码片段: char *string1= This is a character buffer char *string2= 如果在 Visual C+ 中启用了字符串池选项 /GF,那么在执行期间,将在程序的映像中仅保存该字符串的单个副本,且 string1 与 string2 相等。需要说明的是,g+ 的行为正好与它相反,在缺省情况下,string1 与 string2 相等。要在 g+ 中禁用字符串池,您必须将 -fwritable-strings 选项添加到 g+ 命令行。使用 wchar_tC+ 标准定义了 wchar_t 宽字符类型。如果将 /Zc:wchar_t 选项传递给编译器,那么 Visual C+ 会将 wchar_t 作为本地类型。否则,需要包含一些实现特定的 Header,如 windows.h 或者一些标准的 Header(如 wchar.h)。g+


    注意事项

    本文(从windows到unix移植from IBM论坛Word文档格式.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开