社区
C语言
帖子详情
Linux下的C如何移植到windows下(用了linux下的函数)
xinchangpeng
2009-08-05 08:32:01
Linu下的程序,用了Linux 下的erand48()函数
如何移植到windows下呢?
装了个 LibGW32C for Windows (里面有erand48函数)但是不会用
谁能帮我呢?
谢谢
...全文
385
7
打赏
收藏
Linux下的C如何移植到windows下(用了linux下的函数)
Linu下的程序,用了Linux 下的erand48()函数 如何移植到windows下呢? 装了个 LibGW32C for Windows (里面有erand48函数)但是不会用 谁能帮我呢? 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Wind_Runner
2009-08-14
打赏
举报
回复
学习了~~~
猫已经找不回了
2009-08-14
打赏
举报
回复
[Quote=引用楼主 xinchangpeng 的回复:]
Linu下的程序,用了Linux 下的erand48()函数
如何移植到windows下呢?
装了个 LibGW32C for Windows (里面有erand48函数)但是不会用
谁能帮我呢?
谢谢
[/Quote]
如果纯一直过去,把系统调用相关的改掉就是了。
像随机数这种,能用标准的C/C++,是最好的
happy1986
2009-08-14
打赏
举报
回复
[Quote=引用 4 楼 jamesf1982 的回复:]
引用 2 楼 mjp_mjp 的回复:
一般,只要采用了标准c函数库,都可以移植;不过,如果使用其他标准,一般也可以移植的,比如pthread等等。另外,windows/linux平台有些类似的函数,你可以自己封装一套低级api的包装库,这样,就不会遇到这样的问题了。如果是c编程,最好也采用层体系结构,其他,上层不会与底层低级api打交道。
对于常用的函数,如创建线程,建议封装,利用宏来去区分环境
例如
void oss_create_thread()
{
#ifdef OSS_WIN_NT
//windows创建线程
#endif
#ifdef OSS_VX_WORKS
//VxWorks创建线程
#endif
#ifdef OSS_LINUX
//linux创建线程
#endif
}
[/Quote]
不错的做法
james_hw
2009-08-14
打赏
举报
回复
[Quote=引用 2 楼 mjp_mjp 的回复:]
一般,只要采用了标准c函数库,都可以移植;不过,如果使用其他标准,一般也可以移植的,比如pthread等等。另外,windows/linux平台有些类似的函数,你可以自己封装一套低级api的包装库,这样,就不会遇到这样的问题了。如果是c编程,最好也采用层体系结构,其他,上层不会与底层低级api打交道。
[/Quote]
对于常用的函数,如创建线程,建议封装,利用宏来去区分环境
例如
void oss_create_thread()
{
#ifdef OSS_WIN_NT
//windows创建线程
#endif
#ifdef OSS_VX_WORKS
//VxWorks创建线程
#endif
#ifdef OSS_LINUX
//linux创建线程
#endif
}
Darkneece
2009-08-14
打赏
举报
回复
将调用系统API的地方封装,然后根据平台修改API
FirryHere
2009-08-07
打赏
举报
回复
一般,只要采用了标准c函数库,都可以移植;不过,如果使用其他标准,一般也可以移植的,比如pthread等等。另外,windows/linux平台有些类似的函数,你可以自己封装一套低级api的包装库,这样,就不会遇到这样的问题了。如果是c编程,最好也采用层体系结构,其他,上层不会与底层低级api打交道。
phz1985
2009-08-07
打赏
举报
回复
既然装了相应的库,那你指明include路径和lib路径不就行了吗?
将
Windows
动态链接库
移植
到
Linux
-C/C++开发
将
Windows
Dynamic Link库
移植
到
Linux
简介此存储库包含一个库,该库允许本机
Linux
程序从
Windows
DLL加载和调用
函数
。 作为演示,我已将
Windows
移植
Windows
动态链接库
移植
到
Linux
简介此存储库包含一个库,该库允许本机
Linux
程序从
Windows
DLL加载和调用
函数
。 作为演示,我已将
Windows
Defender
移植
到
Linux
。 $ ./mpclient eicar.com main():正在扫描eicar.com ... EngineScanCallback():正在扫描输入EngineScanCallback():已识别威胁病毒:DOS / EICAR_Test_File。 它是如何工作的? peloader目录包含一个自ndiswrapper派生的自定义PE / COFF加载器。
cpp-将
Windows
动态链接库
移植
到
Linux
该存储库包含一个库,允许原生
Linux
程序加载和调用来自
Windows
DLL的
函数
linux
下c语言高级编程入门
本课程主要学习
linux
下的各种API以及
linux
下常用命令的使用,从开发环境的搭建到一行一行的编写小示例来完成各个API的调用,通过学习本课程可以很轻松进入
linux
、C语言高级编程的世界。
windows
上可编译
Linux
内核
编译过程: 1). 解压后默认的文件夹位置是在D:\
Linux
-0.11,如果你不是将文件解压到该目录下, 你要修改MinGW32目录下的MinGW32.bat文件,将里面的PATH指向MinGW32的bin目录. 2). 打开
Linux
-0.11目录,双击MinGW32.bat快捷方式,打开控制台. 3). make 一下,生成1.44M的Boot.img软盘镜像,要清除编译结果请"make clean" 4). 如果安装了bochs,直接双击bochsrc.bxrc即可运行
Linux
-0.11了. 5). 也可用其它虚拟机加载Boot.img后运行,如果出现Kernel panic,请把虚拟机里的硬盘删了 6). 在出现Insert root floppy and press ENTER以后,将rootimage-0.11.img载入虚拟软驱,回车 这就是能在
windows
环境下编译的
Linux
0.11了,不是在Cygwin,也不是在虚拟机里,而是使用MinGW. 下面是在
Windows
下编译
Linux
0.11会遇到的问题和对原文件作的修改: 1.赵炯博士已经将汇编程序中引用的C变量(包括嵌入汇编的C变量)的下划线去掉了,但MinGW的gcc可能是为了与其它
Windows
下的编译器保持兼容,并不能识别这些不带下划线的C变量,因而还得把原先已经在汇编程序中去掉下划线的C变量加上下划线,同时也要把被C程序引用的汇编程序中的变量加上下划线. 2.MinGW中不带as86编译器,因而把boot目录下原先用as86编译的bootsect.s和setup.s两个程序修改成能用nasm编译的程序.并且更名为bootsect.asm和setup.asm. 3.在Makefile作的主要修改: 在LDFLAGS中加了--image-base 0x0000 将elf_i386改成i386pe 将cd 与 make 之间的;改成&,如cd kernel ; make 改成cd kernel & make MinGW中没有sync这个程序,可以把它注释掉,更简单的办法是写一个sync.c,这个sync.c只包含一个空的main
函数
,编译成sync.exe 因为类似的原因,make dep会出错 4.生成的system文件是PE格式的(PE是Portable Executable的简称),这是
windows
下的可执行文件的格式,显然是不能直接执行的,必须加以转化.我实现了通过两种方式加以转化. 1)写一个程序Trans.cpp将system.exe里的代码和数据从PE文件里解析出来,生成一个system.bin文件,这个文件是能被setup模块直接加载的.我已经将这个程序放在了
Linux
-0.11的tools目录下,要微软的编译器编译. 2)自己写一个PE Loader,这种方式比较麻烦,但是想想自己也能做一个PE Loader,还是满有成就感的,尽管这是一个最简单的Loader.代码是加在
Linux
-0.11-With-PE-Loader\boot目录下的setup.asm文件里,里面有详细的注释. 5.对tools下的build.c作了修改,使其能生成可引导的1.44M的软盘镜像文件Boot.img 6.在Link的过程中,init目录下的main.c会出现以下错误: boot/head.o(.text+0x540c):fake: undefined reference to `_main' init/main.o(.text+0x16f):main.c: undefined reference to `_alloca' init/main.o(.text+0x174):main.c: undefined reference to `__main' make: *** [tools/system.exe] Error 1 第一个和最后一个错误还好理解,但中间那个错误那就莫明其妙了,因为
Linux
0.11根本没有这个
函数
,在gcc的编译选项里也有-nostdinc .有一个解释是main
函数
不是一个普通的
函数
,MinGW gcc会对它作特殊的处理.解决的办法其实也很简单,把main.c下面的main
函数
改名为_main,或者是干脆把它改成另外一个
函数
,就改成start吧.记得把head.s里的_main也改了. 在最后,要感谢《自己动手写操作系统》的作者于渊,其实我也是先将原先只能在
Linux
下编译的书里源代码用MinGW
移植
到
Windows
下编译的过程中才试着在
Windows
下编译
Linux
0.11源代码的,有了在
Windows
下编译
Linux
0.11源代码的经验,
移植
高版本的源代码,像0.12,0.95,0.96等等版本应该不会有太大的麻烦了。 也要感谢
Linux
内核完全注释的作者赵炯博士,是他拉接了操作系统与操作系统爱好者的距离. 最后,我也非常想和操作系统爱好者们共同交流心得体会,也希望能多认识一些朋友. 我的网名:flyfish 我的QQ:785606288 E-mail:I2CBus@126.com 另外,要转载请保持本文件的完整性,请尊重别人的劳动果实. 修改日志: 08/3/29 修改了一下Makefile,旧的Makefile在某些文件更新后还会重新编译。 修改了Trans.cpp中的一个dug,该dug在translate MinGW gcc编译的程序时可能会出错。用MinGW gcc 编译的程序的VirtualAddress的形式可能是0xFFC1000这样的形式,其实0x1000才是它的VirtualAddress 08/4/2 修改了下MinGW32.bat,现在已经不用重设路径了。 08/4/4 Trans.cpp还是有错,如果VirtualAddress>0xffff,那么生成的system.bin就错了,bochs调试时会一直重启。 权宜之计,把0xffff再改成0x3ffff,这样VirtualAddress就不能大于0x3ffff,不知谁有更好的解决方法,
glib库是
Linux
平台下最常用的C语言
函数
库
glib库是
Linux
平台下最常用的C语言
函数
库,具有很好的可
移植
性和实用性。它是Gtk+库和Gnome的基础,并且可以在多个平台下使用,如
Linux
、Unix、
Windows
等。glib库为许多标准的、常用的C语言结构提供了相应的替代物
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章