windows下C++程序移植到linux下的问题

时间:2022-08-28 15:20:13
把windows下C++程序移植到linux下的问题要注意那些问题,最近接到上近命令,要把之前用C++写的一个协议解析程序移植到LINUX下运行,在网上看了些东西,但感觉还是无从下手,比如CString等windows下的东西怎么处理,求高手指点,最好尽量详细一点,因为我是菜鸟!!成分感谢!!

27 个解决方案

#1


把所有windows和mfc相关的都剔除掉,数据结构换成stl的,系统调用换linux下类似功能的。
如果之前与windows结合太紧的话,有些地方可能需要重写

#2


尽量的采用标准库和跨平台库来写

#3


CString是MFC里的,可以改用string。

如果代码一开始就没考虑移植,代码里到处分布了一大推系统特有的东西,那改起来就很麻烦了。

#4


个人认为先要学会在linux下使用
man 要查看帮助的shell命令或c语言函数
man 2 要查看帮助的c语言函数
命令。

#5


确实没怎么考虑移植,所以现在都不知道怎么下手

#6


那位朋友有没有从windows下C++程序移植到linux下的相关资料,在网上怎么找不到什么资料

#7


所有windowsAPI提供的数据结构都替换成STL中相应的就行了,例如cstring改为std::string ,不过如果工程比较大,改起来估计很头疼,主要是很多windownsAPI提供的函数借口需要替换或者重写……

#8


如果你在原来的程序中大量用了Windows API的话,建议你不要移植了,重新写吧!!还少烦恼呢。。

#9


用了太多就不好改了

#10


相对于移植程序,更关注一开始就设定平台无关框架,做多平台支持的程序。大多开源程序都是如此,就是不清楚其是如何一步步开发构建起来的,CMake?

#11


拿到Linux 下编译 然后把错误全部搞定~ 就OK了~~~

#12


你的程序是看样子事用MFC来写的,基本上就别想改成linux下能运行的,还是重写吧,如果一开始只用一些基和标准的网络API来写程序,像:send,recv,select等,而不是用扩展的api的话,不用widnows下的非阻塞api的话,并且字符处理和数据处理,以及基本的数据结构,都自己实现,那估计在unix,bsd,。。。畅通无阻,在任何系统上修改一下相应的头文件名称,重新编译一下就行了。

#13


不可能移植的,不是想像中那么簡單的

#14


学习一下

#15


几无可能

#16


1、检查涉及MFC特性的代码有多少,与linux下不兼容的API有哪些。
2、能用宏定义的进行宏定义,如win32下Sleep(1000)==linux下sleep(1),处理方法如下。
#ifndef WIN32
#defin Sleep(i) sleep(i/1000)
#endif
这样,Sleep(1000)这个WIN32下的函数在linux下也就是正常的调用。
3、数据类型尽量使用标C/C++中的,CString用sting代替,或用char []代替。

#17


涉及UI部分的没具体做过,但非UI的代码,都是可以处理的。

#18


协议解析程序属于后台数据处理类的程序,应该好写的多,你还可以将他写成win32和linux下兼容的代码,方便在不同的平台下使用。

#19


先谢谢大家的帮助,现在在写makefile,发现这个又不会写
我现在有二个项目A(A.h,A.cpp)/B(B.h,B.cpp),A要编译成一个静态库A.a,B要编译成一个动态库B.so,但A又调用了一个动太库C.so,这个makefile要怎么写呢?我是第一次接触linux,是个菜鸟,求高手帮忙写一个,越详细越好,万分感谢!!!

#20


這個也是說明為何很多跨平台的程序,
它們的代碼量為何這麼大, 
它們是一個程序,當中又有WINDOWS,又有LINUX的代碼,

#21


使用string,使用windows sdk,使用ini文件等等比较多。

干脆推翻了重写得了。

#22


1、先花点时间熟悉linux下c/c++程序如何编写,如楼主提到的makefile等问题;
2、尽量用夸平台库库,stl等;
3、与系统有关的实现多用宏,或者自己写函数封装;
4、一个个文件编译,一个个错误改,还是有可能的,如果代码量特别大,可以考虑重写。。

#23


直接编译,哪里有错误改哪里

#24


引用 8 楼 jdk_mo 的回复:
如果你在原来的程序中大量用了Windows API的话,建议你不要移植了,重新写吧!!还少烦恼呢。。


++

#25


直接运行在Linux下的WinXP虚拟机上不就完了。

#26


MFC是不可移植的,怎么能移植到linux?所谓的移植就是重写!

#27


移植的话,就是Windows系统的API都不能用了
换用linux下的来实现就可以了
如果涉及到MFC的话,比如CString 用string 
如果还有什么窗口之类的话,呵呵,不用我说了吧

#1


把所有windows和mfc相关的都剔除掉,数据结构换成stl的,系统调用换linux下类似功能的。
如果之前与windows结合太紧的话,有些地方可能需要重写

#2


尽量的采用标准库和跨平台库来写

#3


CString是MFC里的,可以改用string。

如果代码一开始就没考虑移植,代码里到处分布了一大推系统特有的东西,那改起来就很麻烦了。

#4


个人认为先要学会在linux下使用
man 要查看帮助的shell命令或c语言函数
man 2 要查看帮助的c语言函数
命令。

#5


确实没怎么考虑移植,所以现在都不知道怎么下手

#6


那位朋友有没有从windows下C++程序移植到linux下的相关资料,在网上怎么找不到什么资料

#7


所有windowsAPI提供的数据结构都替换成STL中相应的就行了,例如cstring改为std::string ,不过如果工程比较大,改起来估计很头疼,主要是很多windownsAPI提供的函数借口需要替换或者重写……

#8


如果你在原来的程序中大量用了Windows API的话,建议你不要移植了,重新写吧!!还少烦恼呢。。

#9


用了太多就不好改了

#10


相对于移植程序,更关注一开始就设定平台无关框架,做多平台支持的程序。大多开源程序都是如此,就是不清楚其是如何一步步开发构建起来的,CMake?

#11


拿到Linux 下编译 然后把错误全部搞定~ 就OK了~~~

#12


你的程序是看样子事用MFC来写的,基本上就别想改成linux下能运行的,还是重写吧,如果一开始只用一些基和标准的网络API来写程序,像:send,recv,select等,而不是用扩展的api的话,不用widnows下的非阻塞api的话,并且字符处理和数据处理,以及基本的数据结构,都自己实现,那估计在unix,bsd,。。。畅通无阻,在任何系统上修改一下相应的头文件名称,重新编译一下就行了。

#13


不可能移植的,不是想像中那么簡單的

#14


学习一下

#15


几无可能

#16


1、检查涉及MFC特性的代码有多少,与linux下不兼容的API有哪些。
2、能用宏定义的进行宏定义,如win32下Sleep(1000)==linux下sleep(1),处理方法如下。
#ifndef WIN32
#defin Sleep(i) sleep(i/1000)
#endif
这样,Sleep(1000)这个WIN32下的函数在linux下也就是正常的调用。
3、数据类型尽量使用标C/C++中的,CString用sting代替,或用char []代替。

#17


涉及UI部分的没具体做过,但非UI的代码,都是可以处理的。

#18


协议解析程序属于后台数据处理类的程序,应该好写的多,你还可以将他写成win32和linux下兼容的代码,方便在不同的平台下使用。

#19


先谢谢大家的帮助,现在在写makefile,发现这个又不会写
我现在有二个项目A(A.h,A.cpp)/B(B.h,B.cpp),A要编译成一个静态库A.a,B要编译成一个动态库B.so,但A又调用了一个动太库C.so,这个makefile要怎么写呢?我是第一次接触linux,是个菜鸟,求高手帮忙写一个,越详细越好,万分感谢!!!

#20


這個也是說明為何很多跨平台的程序,
它們的代碼量為何這麼大, 
它們是一個程序,當中又有WINDOWS,又有LINUX的代碼,

#21


使用string,使用windows sdk,使用ini文件等等比较多。

干脆推翻了重写得了。

#22


1、先花点时间熟悉linux下c/c++程序如何编写,如楼主提到的makefile等问题;
2、尽量用夸平台库库,stl等;
3、与系统有关的实现多用宏,或者自己写函数封装;
4、一个个文件编译,一个个错误改,还是有可能的,如果代码量特别大,可以考虑重写。。

#23


直接编译,哪里有错误改哪里

#24


引用 8 楼 jdk_mo 的回复:
如果你在原来的程序中大量用了Windows API的话,建议你不要移植了,重新写吧!!还少烦恼呢。。


++

#25


直接运行在Linux下的WinXP虚拟机上不就完了。

#26


MFC是不可移植的,怎么能移植到linux?所谓的移植就是重写!

#27


移植的话,就是Windows系统的API都不能用了
换用linux下的来实现就可以了
如果涉及到MFC的话,比如CString 用string 
如果还有什么窗口之类的话,呵呵,不用我说了吧