C/ c++的跨平台兼容性(从Java移植项目)

Cross platform compatibility in C/C++ (porting a project from Java)?

本文关键字:Java 项目 c++ 跨平台 兼容性      更新时间:2023-10-16

我用Java/JavaFX写了一个程序,因为我需要跨平台支持。随着我的进步,我需要做一些底层的操作系统网络操作,这在Java中是不可能的。我从Runtime.exec()开始,搬到JNA/JNI,现在我担心维护Java的操作系统兼容性最终会比仅仅移植到本机应用程序更多的工作。

最好的方法是什么?

我知道GTK+被*nix和windows支持,所以我想我将使用它作为我的UI。为每个操作系统维护不同版本的应用程序有多困难?对于编写需要跨平台但仍然具有低级别操作系统访问权限的东西,您能推荐一个起点吗?我有很多Java经验(以及大量的c++和OpenGL),但我从来没有关心过Linux以外的任何东西。

或者,是否有一种好的方法可以从Java构建原始数据包、发送ICMP ping和执行其他低级网络任务?

由于您对本机代码的需求似乎与网络数据包有关,因此您可以查看一下JPCAP。注意:JPCAP有两个分支:一个托管在SourceForge上(软件包net.sourceforge.jpcap.net),它不支持发送,另一个是我在这里链接的(软件包jpcap,它最初托管在http://netresearch.ics.uci.edu/kfujii)。我认为这对于大多数"低级"网络操作(包括在混杂模式下侦听,发送非ip数据报,ICMP等)来说已经足够了。

你的问题很笼统,所以我在这里列出一些最佳实践。如果你相应地编辑你的问题,我可以缩小范围。

1-最重要的是编译器和构建环境。这可能是微不足道的选择,ClangGCC在所有主要平台上都支持。然而,构建环境有点棘手。仅仅一个Makefile并不适用于所有平台。相反,您可以选择CMakeSCons。这将帮助您更容易地管理源代码并在所有系统上生成适当的makefile。

2-您可能希望在所有平台上构建相同的GUI。在这种情况下,您可以使用QtGTK+

3-文件输入输出。如果您有很多文件I/O,您可能需要查看一下Boost文件系统

4-对于您使用的所有其他库,确保它们在所有平台上都得到支持。一般来说,我建议使用历史上维护得很好的库,比如Boost

5-最后,使用PIMPL习语隐藏平台特定的代码。

如果你想深入了解跨平台c++编程,这里有一本好书:c++跨平台开发:构建Mac OS X, Linux和Windows应用程序。

Qt可能是跨平台GUI的最佳选择。我不认为GTK+是一个很好的选择,如果你的目标是Windows(或Mac)。然而,也许这种情况已经改变了。我好久没去看了。

Boost和Poco都是很好的跨平台c++库。它们也都提供网络库(boost asio和Poco Net)。

boost和Poco都支持发送ICMP ping请求。

我不确定这些库是否允许您构建自己的以太网帧和IP数据包。

更多的是设计的东西,

  1. 尽可能使用跨平台库(例如:boost)
  2. 编写平台特定代码,并在其上编写良好的抽象层。

示例:Windows/Signaling, Linux/Signaling, Signaling在这里,

  • Windows/Signaling是Windows平台特有的信令码
  • Linux/Signaling是Linux平台特有的信令码
  • 信令是平台抽象层,编译时可以决定平台