C/ c++的跨平台兼容性(从Java移植项目)
Cross platform compatibility in C/C++ (porting a project from Java)?
我用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-最重要的是编译器和构建环境。这可能是微不足道的选择,Clang和GCC在所有主要平台上都支持。然而,构建环境有点棘手。仅仅一个Makefile并不适用于所有平台。相反,您可以选择CMake或SCons。这将帮助您更容易地管理源代码并在所有系统上生成适当的makefile。
2-您可能希望在所有平台上构建相同的GUI。在这种情况下,您可以使用Qt或GTK+。
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数据包。
更多的是设计的东西,
- 尽可能使用跨平台库(例如:boost)
- 编写平台特定代码,并在其上编写良好的抽象层。
示例:Windows/Signaling, Linux/Signaling, Signaling在这里,
- Windows/Signaling是Windows平台特有的信令码
- Linux/Signaling是Linux平台特有的信令码
- 信令是平台抽象层,编译时可以决定平台
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- 在Java项目中使用CPP和OpenCV项目的.so文件
- 将C++项目迁移到 Java,保护实现细节
- 如何将 gnu-libstdc++ 包含在 JNI Java swing 项目中
- CMAKE 将 java 库添加到 cpp 项目中
- 使用Java和C 一起使用Android项目
- 如何在Firebreath插件框架中使用基于Java的项目
- 使用 JNI 将 C# 加载到 Java 项目中的未解决链接错误
- 结合 C++ 和 Java 项目
- 如何在使用JNI的C++/Java项目中使用CRT中的工具检测内存泄漏
- IDE,框架,代码管理器工具,在一个项目中支持Java和C++的东西
- Android项目将部分Java代码改为c++
- C/ c++的跨平台兼容性(从Java移植项目)
- CMake访问SWIG并将java库链接到现有的c++项目时出现的问题
- Eclipse中的Java/ c++项目管理
- 将Java/C++代码库转换为基于IDE的项目
- 使用ENVDTE时的Java脚本-将新项目添加到现有解决方案中,并将其定位在特定的子文件夹中