Я пытаюсь получить абсолютный путь к скомпилированному файлу во время компиляции в C++. Мне известен макрос __FILE__
, однако макрос может быть вычислен как по абсолютному, так и по относительному пути, в зависимости от аргументов препроцессора.
Я хотел бы убедиться, что мой __FILE__
(или любой другой макрос) оценивает полный, абсолютный путь к файлу. Есть ли способ надежно сделать это кроссплатформенным? (Я компилирую для VS2013, VS2015, GCC на ubuntu, GCC на MinGW)
Чего вы пытаетесь достичь? Может, подходящим решением будет пройти что-то вроде -DDIR=$PWD
?
@ Jean-FrançoisFabre Спасибо! Это работает в GCC - я настроил свои make-файлы для работы таким образом. Однако в Visual Studio VS контролирует пути. В настоящее время я использую это решение для получения каталога проекта в Visual Studio: stackoverflow.com/a/38203437/2946480. Затем в своем коде я добавляю несколько #ifdefs
, чтобы таким образом получить абсолютный путь. Однако было бы здорово иметь универсальное решение.
@EugeneSh. Я пытаюсь получить абсолютный путь для ведения журнала. Я сравниваю путь к корню репозитория GitHub, чтобы получить путь к файлу относительно корня репозитория. Не могли бы вы подробнее рассказать о флаге -DDIR=$PWD
? Я не мог найти никакой информации по этому поводу.
Я предполагаю, что трюк с $PWD
таков: $PWD
- это переменная оболочки (вероятно, из make
), которая имеет текущий каталог. Я считаю, что вам нужно добавить двойные кавычки (например, -DDIR=\"$PWD/\"
), а затем, когда вы используете __FILE__
, вы можете использовать DIR __FILE__
. Это две строки наподобие: "/foo/"
и "bar.c"
, а компилятор [всегда] объединяет две примыкающие друг к другу строки (т.е. результат - "/foo/bar.c"
). DIR
не обязательно должен быть PWD
, но может [может быть, лучше быть] директорией проекта, как вы описали
@CraigEstey Спасибо! Теперь это имеет гораздо больше смысла. Я думал, что -DDIR
был предопределенным флагом. Вместо этого -D
- это флаг, и в этом контексте он означает: define DIR as $PWD
, правильно?
Да, вместо DIR
вы можете назвать его MY_SUPER_DUPER_PROJECT_DIRECTORY_TOP
[если хотите :-)]. Не забудьте использовать двойные кавычки с обратной косой чертой, поскольку DIR
должен преобразовать нить в эквивалент: #define DIR "/foo/"
. Когда я делаю такие вещи, я использую PRJDIR
или PRJSRC
.
Отвечает ли это на ваш вопрос? Макрос __FILE__ показывает полный путь
@phuclv Я думаю, это решает противоположный вопрос. Я ищу абсолютный, а не относительный путь.
на этот вопрос уже есть ответ: В VC при использовании / FC __FILE__
расширяется до полного пути. Как принудительно указать абсолютные пути для вывода ошибок сборки в Visual Studio
Этот вопрос касается только Visual Studio. Я спрашивал здесь о различных платформах, надеясь на санкционированный язык способ сделать это, или, по крайней мере, на то, что работает с gcc и vc.
передать абсолютный путь при компиляции файла, по крайней мере, когда вы управляете сборкой, как в make-файле