C++ 一般C&x2B+;Linux到Windows的移植问题
背景:存在一种基于网络的服务(C++ 一般C&x2B+;Linux到Windows的移植问题,c++,windows,visual-studio,g++,porting,C++,Windows,Visual Studio,G++,Porting,背景:存在一种基于网络的服务(tcp+udp,而不是http),即将公开发布C++linux客户端API。该客户端API使用普通TCP套接字、UDP套接字、C++名称空间和STL类代码“代码> STD::MAP和代码> STD::向量,并将作为一组头文件和发布。 问题:刚刚开始研究将C++客户端API移植到Windows需要什么。在Windows下使用gcc/g++有意义吗?我的第一个倾向是,这不起作用,因为Windows上的开发人员通常使用Microsoft Visual Studio套件,
tcp+udp
,而不是http
),即将公开发布C++
linux客户端API。该客户端API使用普通TCP套接字、UDP套接字、C++名称空间和STL类代码“代码> STD::MAP<代码/代码>和代码> STD::向量,并将作为一组头文件和<代码>发布。
<强>问题:刚刚开始研究将C++客户端API移植到Windows需要什么。在Windows下使用gcc/g++有意义吗?我的第一个倾向是,这不起作用,因为Windows上的开发人员通常使用Microsoft Visual Studio套件,而且他们无法链接gcc生成的库。这是一个正确的假设,还是gcc提供了一些漂亮的开关,可以生成与Microsoft编译器和Microsoft链接器兼容的输出文件?
只要您使用的编译器生成正版.dll或.lib文件,就不应该在Windows中将它们与标准链接器链接时出现问题。但是,只有非托管开发(意味着经典的Win32 API开发)或C++/CLI才能链接到这些.dll。如果编译为.dll(而不是.lib),则可以使用P/Invoke语法从托管上下文(C#、VB.NET等)中以该程序集为目标,但如果所做的只是标准套接字读/写操作,则最好在.NET中编写完全托管的实现归根结底,这取决于你想要的目标受众:对于经典的Win32,你很好。对于托管目标(C++/CLI之外的任何.NET),最好用C#或VB.NET编写托管实现。只要您使用的编译器生成正版.dll或.lib文件,就不应该在Windows中将它们与标准链接器链接时出现问题。但是,只有非托管开发(意味着经典的Win32 API开发)或C++/CLI才能链接到这些.dll。如果编译为.dll(而不是.lib),则可以使用P/Invoke语法从托管上下文(C#、VB.NET等)中以该程序集为目标,但如果所做的只是标准套接字读/写操作,则最好在.NET中编写完全托管的实现
归根结底,这取决于你想要的目标受众:对于经典的Win32,你很好。对于托管目标(任何.NET,除了C++ + CLI),最好在C或VB.NET中编写托管实现。< P>我建议制作公共API标准C,因为C++库甚至在Windows上不同编译器上都是不可移植的。如果需要C++,在C API之上构建一个小的C++包装器,并将包装源分发到库。
如果你想要一个纯C++ API,如果你不想为每个编译器建立一个版本(或者只分发VisualC++库),你可以分发这个源。取决于分布式资源是否可以接受……
< P>我建议制作公共API标准C,因为C++库甚至在Windows上不同编译器上都是不可移植的。如果需要C++,在C API之上构建一个小的C++包装器,并将包装源分发到库。如果你想要一个纯C++ API,如果你不想为每个编译器建立一个版本(或者只分发VisualC++库),你可以分发这个源。但这取决于分布式源是否可接受
这是一个正确的假设,还是gcc提供了一些漂亮的开关来生成与Microsoft编译器和Microsoft链接器兼容的输出文件 <>这是C++编译文件的正确假设。我看过一些关于如何将其添加到GCC的对话,结论是这是可能的,但需要做大量的工作 然而,对于C库来说,情况远不是这样;这些应该更便于携带。对您来说,可行的一个选择是将您分配的所有事物作为预编译代码转换成C,然后将需要C++的东西放入用户编译的头文件。 这是一个正确的假设,还是gcc提供了一些漂亮的开关来生成与Microsoft编译器和Microsoft链接器兼容的输出文件 <>这是C++编译文件的正确假设。我看过一些关于如何将其添加到GCC的对话,结论是这是可能的,但需要做大量的工作然而,对于C库来说,情况远不是这样;这些应该更便于携带。一种对您来说可行的选项是将所有您分发的东西作为预编译代码转换成C,然后将需要C++的东西放入用户编译的头文件中。 为什么不创建一个DLL,用GePosiTrand和函数指针来创建一个头文件? 然后,您可以在Windows上使用msys使用MinGW(g++/gcc)编译API。 您只需要添加一些windows代码,例如网络头和wsastartup,链接到libwsock32
此外,将代码移植到VC++应该没有问题,它只需要一个项目和一些针对windows特定代码的ifdef。为什么不创建一个dll,并创建一个带有GetProcAddress和FunctionPointer的头文件 然后,您可以在Windows上使用msys使用MinGW(g++/gcc)编译API。 您只需要添加一些windows代码,例如网络头和wsastartup,链接到libwsock32
<> P>此外,将代码移植到VC++中不应该是个问题,它只需要一个项目和一些特定于Windows特定代码的IFDES。 < P>问题是C++中没有名字命名的标准,即使存在,从不同编译器链接C++代码也会有问题。这实际上是