Как правильно указать пути #include в c ++, чтобы сделать вашу программу переносимой - PullRequest
0 голосов
/ 18 июня 2020

Я долго боролся с этим, сейчас ищу материал и задаю вопросы, и я все еще на распутье. То, что я сделал до сих пор и где я сейчас нахожусь, исходя из того, что мне сказали, таково: я добавил 2 каталога в свое репо: sr c для моего. cpp файлы и включают для моих файлов .hpp. В моем каталоге include у меня есть все файлы .hpp прямо в папке, где, как и в моем каталоге sr c, у меня есть несколько подкаталогов, группирующих мои файлы. cpp в соответствии с для той цели, которой они служат, например, \src\ValuationFunctions\MonteCarloFunctions\FunctionHelpers.

Я изменил имена всех #include "header.h" на #include "..\include\header.h". Это работает для моего основного файла, который находится непосредственно в папке sr c, но теперь я обнаружил, что это не работает для моих файлов. cpp, которые находятся в подкаталогах, как в моем примере выше Казалось бы, мне пришлось бы вернуться в папку root, сделав что-то вроде #include "../../..\include\header.h", что, очевидно, не может быть способом go.

Как мне сделать эту работу, я здесь даже на правильном пути? Я загрузил свое репо на github (https://github.com/OscarUngsgard/Cpp-Monte-Carlo-Value-at-Risk-Engine), и цель состоит в том, чтобы кто-то мог go там, посмотреть, как структурирована программа, клонировать репо и просто запустить его (я представляю это то, что всегда является целью? Или некоторая ответственность обычно ложится на клонировщика репо, чтобы заставить его работать?).

Я использую Windows и Visual Stud ios, помощь очень ценится .

Ответы [ 2 ]

1 голос
/ 19 июня 2020

При разработке программ часто бывает необходимо использовать наборы инструментов, разработанные другими. Вообще говоря, в Visual Studio исходные файлы используются редко, и в большинстве из них используются файлы заголовков и библиотеки ссылок, объявляющие классы. Если вы хотите использовать эти классы, вам нужно включить имя файла заголовка в файл, например #include «cv.h». Но этого недостаточно, потому что этого файла обычно нет в текущем каталоге, решение выглядит следующим образом:

Откройте «Project-Properties-Configuration Properties-C / C ++ - General-Additional Include Directory» по очереди и добавьте все пути.

Для всех типов IDE мы можем выполнять аналогичные операции для включения каталогов. Поэтому для тех, кто клонирует проект, вполне нормально изменить каталог, содержащийся в проекте.

0 голосов
/ 19 июня 2020

Как правильно указать пути #include в C ++, чтобы сделать вашу программу переносимой

Прочтите стандарт C ++ 11 n3337 и посмотрите это Ссылка на C ++ веб-сайт. Включенный заголовок может быть даже не каким-либо файлом на вашем компьютере (в принципе, это может быть некоторая база данных).

Если вы используете недавний G CC в качестве компилятора C ++, он имеет предварительно скомпилированные заголовки и средства оптимизации времени компоновки. Прочтите также документацию его препроцессора. Я рекомендую включить все предупреждения и отладочную информацию, поэтому используйте g++ -Wall -Wextra -g.

. Если вы используете Microsoft VisualStudio в качестве компилятора, у него есть документация и предоставляется команда cl с различные оптимизация объектов. Не забудьте включить предупреждения.

Вы можете рассмотреть возможность использования некоторого анализатора C ++ stati c, например Clang's или Frama-C ++ . Этот черновик отчета может быть актуальным и должен вас заинтересовать (по крайней мере, для справки).

Редактор исходного кода (либо VisualStudioCode , либо GNU emacs или vim или многие другие) и отладчик (например, GDB ) и систему контроля версий (например, git), которые вы используете, также имеют документацию. Пожалуйста, найдите время, чтобы прочитать их, и прочтите Как отлаживать небольшие программы .

Помните, что код C ++ может быть сгенерирован такими инструментами, как ANTLR или SWIG .

Предлагается подойти к вашей проблеме двояко: убедитесь, что правильные пути включения передаются командам компиляции (из вашей автоматизации сборки такой инструмент, как GNU make или ninja или meson ). Это то, что делает GNU autoconf .

Вы можете рассмотреть возможность использования autoconf в своем программном проекте.

Я изменил названия всех # включить "header.h" в #include ".. \ include \ header.h".

Я считаю, что это была ошибка, и вы определенно захотите использовать косую черту, например #include "../include/header.h", если вам нужно перенести свой код позже на другие операционные системы (например, Linux, Android, MacOSX или некоторых других Unix). В большинстве операционных систем разделителем для каталогов является /, и большинство компиляторов C ++ его принимают.

Изучение исходного кода Qt или POCO может быть вдохновляющим, и одна или обе эти библиотеки с открытым исходным кодом могут быть вам полезны. Они кроссплатформенные. Исходный код G CC и Clang также может быть интересен. Оба являются компиляторами C ++ с открытым исходным кодом, написанными в основном на C ++ (с некоторыми подходами к метапрограммированию , то есть некоторым сгенерированным кодом C ++).

См. Также this и это .

...