跨平台的C++命令行工具

4
我需要开发一个Windows/Linux命令行工具。该工具将与中间件通信,该中间件在两个平台上都有标准API。我之前在FreeBSD/Linux上进行过跨平台开发,这要容易得多-而且我可以与有经验的小组成员交流。目前,我的小组中没有人处理过Windows/Linux开发项目。我正在寻求如何最好地设置它的建议。我也是C++的新手,我主要开发C#/.Net GUI应用程序和Linux设备驱动程序级别的“东西”。有点奇怪的组合。我想最好定义自己的数据类型,不使用Linux或Windows定义的类型-将特定于操作系统的代码保留在单独的文件夹中并进行条件包含。这就是我们为Linux/BSD工作所做的。所以这似乎是一个好的开始。这里的一位开发人员非常喜欢Boost...另一个人认为TCLAP命令行解析器库更容易使用...显然,所有内容都必须与许可证兼容。
代码将会开源,但这是生产代码 - 所以我不想马虎。我还应该做什么或寻找什么?有没有最佳实践可供参考?
8个回答

5
Boost和ACE都很好,它们几乎涵盖了您想要以跨平台方式完成的所有内容。我曾经尝试过在Windows上获取POSIX库并在Cygwin上使用GCC,但不推荐这种方法。

我想我也应该问一下为什么我需要额外的库,除了想要使用现成的解析器(这样我就不需要自己编写)。命令行实用程序将调用中间件API来执行“某些操作”,可能唯一需要做的另一件事是写入日志文件。可能。我的假设是,我可以编写“纯香草味”的C++代码,并使其在两个平台上都能正常工作,这种想法是不是太天真了? - Susan
如果你只是解析stdin和/或文件,处理数据,并输出stdout/stderr和/或文件,那么你肯定可以编写“普通的香草C ++”。任何超出这个范围的东西可能需要一些特定于平台的编码(或使用抽象它的第三方库)。 - Pavel Minaev

3

1

大多数项目使用标准的C或C++。只有在必要时才使用特定于平台的函数。如果可能,将这些函数放在隔离文件中的包装器中,以便构建(makefile)可以替换适当平台的正确版本。

避免使用#ifdef LINUX#ifdef WINDOWS或类似的条件编译。这些很难调试,并且当关键字未提供给编译器时容易出错。


这里有很多好的答案 - 但这是一个相当简单的应用程序 - 对我来说,这似乎是最简单的答案(并且与我想的一致...) - Susan

1

使用Boost。除了其他功能外,您还将获得TR1子集的可移植实现,即使仅为了<cstdint>和其中的类型-int32_t等也是值得的。此外,对于许多中等复杂的数据结构,shared_ptr也是必不可少的。

Boost还具有大量辅助类型,在日常C++任务中非常方便。首先想到的两个特定类型是optionalptr_...立即想到的是多态容器类型。字符串算法库也非常方便,考虑到标准库中缺少非常常见的字符串函数,例如大小写转换或修剪。

说到更重量级的组件,Boost.Filesystem是一个非常不错的跨平台抽象,用于文件系统导航,这也是命令行工具中相对常见的任务。然后,Boost.MultiIndex是容器的瑞士军刀-很少真正需要,但当需要时,它是不可或缺的。


0

我今年夏天做了一个.NET的项目,现在刚刚转移到了Mono。效果非常好。


这不是托管代码。它必须在 Windows 安全模式下运行(我们的 .NET Windows 应用程序已经因此出现问题)。 - Susan

0

虽然有一些很好的跨平台库(如Boost),但请记住它们可能不是默认存在的。 如果您只发布二进制文件,则特别麻烦。 目标平台不太可能拥有您所需要的库(或正确版本的库)。

第一名是坚持使用标准C ++(即使您需要自己实现简单的东西)。 这完全避免了对库的依赖。

如果必须使用库,请尝试静态链接库(尽管这可能会创建大型二进制文件)。 这将使您避免因缺少二进制文件而导致的运行时故障。

如果必须发布DLL(或某些Unix上的.so),请确保正确版本随产品一起发布,并提供一些方式以避免与错误版本发生冲突。

如果您要发布代码,请将库与代码一起包含,并构建库以及您的实用程序。

此外要注意GPL和可能的LGPL代码。 如果您发布具有GPL依赖项(或修改LGPL库)的库,则需要根据GPL提供代码并允许重新分发。


有了Boost,这并不是一个真正的问题,因为它主要(或完全?我没有看到任何证据来证明相反)只是头文件。 - Pavel Minaev
我只考虑类BSD许可证的库。但我们计划开源它。我们可能不会发布源代码,但会提供可用性。律师将仔细审核所有内容,以免犯错。 - Susan

0

TCLAP 是我所知道的唯一的仅有头文件的CLI解析选项。因此,它给我留下了最具可移植性的印象,很可能是您的最佳选择(这也是我目前使用和推荐的原因)。此外,TCLAP 的API非常开发人员友好,并自动生成适当格式的帮助消息。

Boost program_options 具有共享库组件,这使得维护ABI变得繁琐。它还可以避免来自getopt参数系列的麻烦解析不兼容性和行为。


0

我使用了libparamset,它是跨平台(Windows、OS X、Linux)的命令行解析器。它提供了灵活和强大的命令行解析器和各种 UI 构建功能(输入错误处理、通配符、错别字检测、任务解决、帮助格式化等),以构建一个好的命令行工具。它适用于 C 和 C++ 项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接