Кроссплатформенная утилита командной строки C ++ - PullRequest
3 голосов
/ 23 декабря 2009

Мне нужно разработать утилиту командной строки Windows / Linux. Утилита будет общаться с промежуточным ПО, которое имеет стандартный API на обеих платформах. Ранее я занимался кроссплатформенной разработкой для FreeBSD / Linux, что было значительно проще - и у меня в группе были люди с опытом, с которым я мог общаться.

На данный момент в моей группе нет никого, кто занимался бы проектом разработки для Windows / Linux. Я ищу совет о том, как лучше всего его настроить. Я тоже новичок в C ++, я в основном разрабатывал приложения на C # /. Net с графическим интерфейсом и "вещи" на уровне драйверов устройств Linux. Какая-то странная смесь.

Я думал, что было бы лучше определить свои собственные типы данных и не использовать определенные типы Linux или Windows - храните специфичный для ОС код в отдельных папках и включайте его условно. Это то, что мы сделали для работы с Linux / BSD. Так что это казалось хорошим началом.

Один из разработчиков здесь большой поклонник Boost ... другая мысль, что библиотеку синтаксического анализатора командной строки TCLAP было проще использовать ... Очевидно, что все должно быть совместимо с лицензированием.

Код будет с открытым исходным кодом, но это производственный код, поэтому я не хочу быть неряшливым. Что еще я должен делать или искать? Есть ли лучшие практики там?

Ответы [ 8 ]

5 голосов
/ 23 декабря 2009

Повышение это хорошо, как и ACE. Между двумя из них они охватывают практически все, что вы хотели бы сделать кроссплатформенным образом. Я также прошел путь получения библиотек posix для Windows и использования gcc на cygwin, но я не рекомендую это.

3 голосов
/ 23 декабря 2009

Используйте переносимое время выполнения, которое поддерживается на обеих платформах. Мне повезло с Apache Portable Runtime .

1 голос
/ 24 декабря 2009

Используйте Boost. Помимо прочего, вы получите переносимую реализацию подмножества TR1, которая того стоит, если только для <cstdint> и типов в пределах - int32_t и т. Д. Кроме того, shared_ptr имеет важное значение для многих данных средней сложности. структур.

Boost также имеет множество вспомогательных типов, которые чрезвычайно удобны в повседневных задачах C ++. Два конкретных, которые сразу приходят на ум, это optional и ptr_ ... полиморфные типы контейнеров сразу приходят на ум. Библиотека строковых алгоритмов также очень удобна, учитывая отсутствие в стандартной библиотеке очень часто необходимых строковых функций, таких как преобразование регистра или усечение.

Говоря о более тяжелых компонентах, Boost.Filesystem - очень приличная кроссплатформенная абстракция для навигации по файловой системе, также довольно распространенная задача в инструментах командной строки. Тогда есть Boost.MultiIndex - швейцарский армейский нож контейнеров - редко действительно необходимый, но когда это необходимо, это необходимо.

1 голос
/ 24 декабря 2009

Используйте стандартные C или C ++ для большей части проекта. Используйте только специальные функции платформы, когда это необходимо. Если возможно, поместите их в оболочку в изолированные файлы, чтобы сборка (make-файл) могла заменить правильную версию для соответствующей платформы.

Не используйте #ifdef LINUX или #ifdef WINDOWS или аналогичную условную компиляцию. Их очень сложно отлаживать, и они подвержены ошибкам, когда ключевое слово не передается компилятору.

0 голосов
/ 14 декабря 2018

Я использовал libparamset , то есть кроссплатформенный анализатор CLI (Windows, OS X, Linux). Он предоставляет гибкий и мощный синтаксический анализатор CLI и различные функции построения пользовательского интерфейса (обработка ошибок ввода, подстановочные знаки, обнаружение опечаток, решение задач, форматирование справки ...) для создания хорошего инструмента командной строки. Подходит как для проектов на C, так и на C ++.

0 голосов
/ 21 января 2013

TCLAP - единственный вариант синтаксического анализа CLI только для заголовка, о котором я знаю. Таким образом, он кажется мне наиболее портативным и, вероятно, является лучшим выбором (в настоящее время я использую его и рекомендую именно по этим причинам). Также помогает то, что API для TCLAP очень удобен для разработчиков и автоматически генерирует сообщения справки в надлежащем формате для вас.

Boost program_options содержит компонент библиотеки осколков, что раздражает при поддержке ABI. Он также позволяет обойти неприятности при разборе несовместимости и поведения из семейства аргументов getopt.

0 голосов
/ 24 декабря 2009

Хотя есть несколько хороших кроссплатформенных библиотек (например, Boost), помните, что они, вероятно, не существуют по умолчанию. Это особенно проблематично, если вы отправляете только двоичные файлы. Целевая платформа вряд ли будет иметь библиотеку (или правильную версию библиотеки), которая вам нужна.

Первый приз - придерживаться стандарта C ++ (даже если вам нужно реализовать простые вещи самостоятельно). Это полностью исключает зависимость от библиотеки.

Если вам нужно использовать библиотеку, попробуйте статически связать ее (хотя это может создать большие двоичные файлы). Это позволит вам избежать сбоя во время выполнения из-за отсутствия двоичных файлов.

Если вам необходимо доставить DLL (или .so в некоторых Unix-системах), убедитесь, что с вашим продуктом поставляется правильная версия и каким-то образом можно избежать конфликтов с неправильной версией.

Если вы отправляете код, включите библиотеку с кодом и соберите библиотеку, а также свою утилиту.

Также остерегайтесь GPL и, возможно, кода LGPL. Если вы выпускаете библиотеку с зависимостью GPL (или изменяете библиотеку LGPL), вам нужно будет предоставить код и разрешить его повторное распространение в соответствии с GPL.

0 голосов
/ 24 декабря 2009

Я выступил этим летом в .NET и просто портировал на Mono . Работал отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...