网站运营配置,中国对外贸易公司排名,上海史特做网站多少钱,做公司网站流程写在开头#xff1a;
最近的copy项目要转到windows版本了#xff0c;一直在跟进做这个事情。
直入主题说下移植过程中可能涉及以下几个方面的调整#xff1a;
编译器和工具链的更改#xff1a;Windows和Linux使用不同的编译器和工具链#xff0c;因此需要在Windo…写在开头
最近的copy项目要转到windows版本了一直在跟进做这个事情。
直入主题说下移植过程中可能涉及以下几个方面的调整
编译器和工具链的更改Windows和Linux使用不同的编译器和工具链因此需要在Windows上安装和配置相应的编译器和工具链。文件路径和文件系统的更改Windows和Linux使用不同的文件系统路径分隔符也不同。因此需要更改应用程序中使用的文件路径和文件系统相关的代码。库文件和依赖项的更改应用程序可能会依赖于Linux上特定的库文件和依赖项这些在Windows上可能不存在或与Linux上的版本不兼容。因此需要更改代码以使用适当的库文件和依赖项。网络接口的更改Linux和Windows上的网络接口也有所不同因此需要更改应用程序中使用的网络接口相关的代码。系统调用的更改Linux和Windows上的系统调用也不同因此需要更改应用程序中使用的系统调用相关的代码。测试和调试移植完成后需要进行测试和调试以确保应用程序在Windows上能够正常运行。
针对以上方向总结细节
检查源代码是否使用了Linux特有的API或库。 文件系统相关 Linux下面文件换行是\n而windows下面是\r\n。 Linux下面目录分隔符是/而windows下面是\。 Linux中可根据stat的st_mode判断文件类型有S_ISREG、S_ISDIR等宏。 Windows中没有需要自己定义相应的宏如#define S_ISREG(m) (((m) 0170000) (0100000))#define S_ISDIR(m) (((m) 0170000) (0040000)) Linux中删除文件是unlinkWindows中为DeleteFile 在Windows平台上可以使用ReadDirectoryChangesW API来监控文件变更 扫描本地目录FindFirstFile和FindNextFile方法 网络相关 linux包含#include sys/socket.h、#include netinet/in.h、#include netdb.h、#include arpa/inet.h windows需要包含#include winsock.h#pragma comment (lib, “ws2_32.lib”) //加载 ws2_32.dll windows socket需要在加载头文件后加载ws库windows需要初始化socket调用WSAStartup方法。Linux中关闭socket为closeWindows中为closesocket。因为linux中的socket与普通的fd一样所以可以在TCP的socket中发送与接收数据时直接使用read和write。windows使用recv和send。Linux 使用“文件描述符”的概念而 Windows 使用“文件句柄”的概念Linux 不区分 socket 文件和普通文件而 Windows 区分 Linux 下 socket() 函数的返回值为 int 类型而 Windows 下为 SOCKET 类型也就是句柄。 设置socet选项比如设置socket为非阻塞的。 Linux下为flag fcntl (fd, F_GETFL);fcntl (fd, F_SETFL, flag | O_NONBLOCK); Windows下为flag 1;ioctlsocket (fd, FIONBIO, (unsigned long *) flag); 当非阻塞socket的TCP连接正在进行时Linux的错误号为EINPROGRESSWindows的错误号为WSAEWOULDBLOCK。 多线程 头文件(win)process.h --〉(linux)pthread.h 方法_beginthread -- pthread_create _endthread -- pthread_exit其他 Linux为srandom和randomWindows为srand和rand。Linux为snprintfWindows为_snprintf。Linux为strcasecmpWindows为_stricmp。Linux下面通常使用全局变量errno来表示函数执行的错误号。Windows下要使用GetLastError ()调用来取得。 修改源代码中的环境变量访问方式。 确保代码中没有使用Linux下的特殊权限或用户组。 如果程序依赖于外部工具或脚本需要在Windows上安装这些工具并修改调用方式。 编写或修改Makefile和编译脚本使其可以在Windows下编译。
另外
还可以采用一些工具和技术来帮助移植过程如使用跨平台的开发工具和集成开发环境如Visual Studio等来帮助在Windows平台上进行代码编译和调试以及使用虚拟化技术来模拟Linux环境以便在Windows上进行程序测试和调试。还有一些第三方的代码转换工具和库可以帮助实现代码的移植和兼容性处理。
总的来说将Linux代码转移到Windows平台是一个复杂的过程需要对操作系统和编程语言的细节有深入的了解。通过合理的准备工作和采用适当的工具和技术可以实现Linux代码向Windows的转换和移植从而让应用程序能够在不同平台上进行部署和运行。
所以总共有两个方向使用虚拟化技术模拟linux环境或者vs三个思路。
方向一
安装gcc使用vscode
1、windows下安装 MinGW
MinGW的安装和使用-CSDN博客
此方法是说 gcc没有对windows的支撑MinGW(mini gnu windows) 对gcc进行了打包封装使其可以在windows上适用它包含了make、gcc。
2、使用mingw32-make 编译
3、处理编译问题
方案二
由于代码量不大可以考虑使用visual stdio。
1、在visual stdio下新建解决方案zcopy并新建两个项目 zcopy和 zcopy-ctl
2、将zcopy和zcopy-ctl项目引入代码。
解决方案可以设置启动项目分别调试和启动目前zcopy和ctl代码在一个项目很不方便所以考虑分开两个项目。
3、编译两个工程处理编译问题。
4、如果用MSVC编译开源库麻烦在于第三方的开源库本身还需要一些依赖库这些依赖库在windows多数并不提供编译好的二进制版本所以要先编译安装各种依赖库。
方案三
使用msys2的虚拟化环境
MSYS2 是msys2的一个升级版,准确的说是集成了pacman 和mingw-w64的 cygwin 升级版, 与MSYS最大的区别是移植了 linux的软件包管理系统 pacman(其实是与Cygwin的区别)。
但是我使用这个环境的时候没有想象中好用我们项目的支持需要openssl、libevent、glib等支持。前两者适配还好后面第三个可能是版本问题一直有编译问题。
最终决定
使用vs的IDE来做这个事情原因有两点
方案1、2第三方虽然说做了很久的支持但是毕竟微软不是开源的所以用vs来做应该更靠谱一些不会出现一些无法解决的问题组里人大部分都一直做linux想感受win的开发环境和方法。哈哈哈哈哈~
完美的解决思路是什么
win_port
/*-------------------------------------------------------------------------** dirent.c* opendir/readdir/closedir for win32/msvc**-------------------------------------------------------------------------*/
#include win32_port.h
#include dirent.hstruct DIR
{char *dirname;struct dirent ret; /* Used to return to caller */HANDLE handle;
};DIR *
opendir(const char *dirname)
{DWORD attr;DIR *d;/* Make sure it is a directory */attr GetFileAttributes(dirname);if (attr INVALID_FILE_ATTRIBUTES){errno ENOENT;return NULL;}if ((attr FILE_ATTRIBUTE_DIRECTORY) ! FILE_ATTRIBUTE_DIRECTORY){errno ENOTDIR;return NULL;}d malloc(sizeof(DIR));if (!d){errno ENOMEM;return NULL;}d-dirname malloc(strlen(dirname) 4);if (!d-dirname){errno ENOMEM;free(d);return NULL;}strcpy(d-dirname, dirname);if (d-dirname[strlen(d-dirname) - 1] ! / d-dirname[strlen(d-dirname) - 1] ! \\)strcat(d-dirname, \\); /* Append backslash if not already there */strcat(d-dirname, *); /* Search for entries named anything */d-handle INVALID_HANDLE_VALUE;d-ret.d_ino 0; /* no inodes on win32 */d-ret.d_reclen 0; /* not used on win32 */d-ret.d_type DT_UNKNOWN;return d;
}struct dirent *
readdir(DIR *d)
{WIN32_FIND_DATA fd;if (d-handle INVALID_HANDLE_VALUE){d-handle FindFirstFile(d-dirname, fd);if (d-handle INVALID_HANDLE_VALUE){/* If there are no files, force errno0 (unlike mingw) */if (GetLastError() ERROR_FILE_NOT_FOUND)errno 0;else_dosmaperr(GetLastError());return NULL;}}else{if (!FindNextFile(d-handle, fd)){/* If there are no more files, force errno0 (like mingw) */if (GetLastError() ERROR_NO_MORE_FILES)errno 0;else_dosmaperr(GetLastError());return NULL;}}strcpy(d-ret.d_name, fd.cFileName); /* Both strings are MAX_PATH long */d-ret.d_namlen strlen(d-ret.d_name);/** For reparse points dwReserved0 field will contain the ReparseTag. We* check this first, because reparse points are also reported as* directories.*/if ((fd.dwFileAttributes FILE_ATTRIBUTE_REPARSE_POINT) ! 0 (fd.dwReserved0 IO_REPARSE_TAG_MOUNT_POINT))d-ret.d_type DT_LNK;else if ((fd.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY) ! 0)d-ret.d_type DT_DIR;elsed-ret.d_type DT_REG;return d-ret;
}int
closedir(DIR *d)
{int ret 0;if (d-handle ! INVALID_HANDLE_VALUE)ret !FindClose(d-handle);free(d-dirname);free(d);return ret;
}#include win32_port.h
#include pthread-win32.hDWORD
pthread_self()
{return GetCurrentThreadId();
}
void
pthread_setspecific(pthread_key_t key, void *val)
{
}void *
pthread_getspecific(pthread_key_t key)
{return 0;
}int
pthread_mutex_init(pthread_mutex_t *mp, void *attr)
{mp-initstate 0;return 0;
}int
pthread_mutex_lock(pthread_mutex_t *mp)
{/* Initialize the csection if not already done */if (mp-initstate ! 1){LONG istate;while ((istate InterlockedExchange(mp-initstate, 2)) 2)Sleep(0); /* wait, another thread is doing this */if (istate ! 1)InitializeCriticalSection(mp-csection);InterlockedExchange(mp-initstate, 1);}EnterCriticalSection(mp-csection);return 0;
}int
pthread_mutex_unlock(pthread_mutex_t *mp)
{if (mp-initstate ! 1)return EINVAL;LeaveCriticalSection(mp-csection);return 0;
}