Как напечатать путь к месту компиляции программы в c - PullRequest
0 голосов
/ 27 сентября 2018

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

Как мы храним значение getcwd() или что-то еще во время самой компиляции?

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

Если вы используете cmake в процессе сборки, вы можете добавить add_definitions(-DSOME_DIR="${CMAKE_CURRENT_BINARY_DIR}") в правильный файл CMakeLists.txt.Это эквивалентно #define SOME_DIR "binaries_dir" в коде.

В качестве альтернативы вы можете использовать любой другой инструмент автоматизации сборки, чтобы убедиться, что компилятору передан правильный флаг -D (GNU) или / D (MSVC) для генерации правильногоопределение (или передать его компилятору вручную, что ничем не отличается от указания его в коде).

0 голосов
/ 27 сентября 2018

Вы можете передать его как определение времени компиляции:

#include <stdio.h>

int main(void) {
    printf("COMPILE_DIR=%s\n", COMPILE_DIR);
    return 0;
}

А затем:

/dir1$ gcc -DCOMPILE_DIR=\"$(pwd)\" current.c -o current

В результате:

/dir1$ ./current 
COMPILE_DIR=/dir1
/dir1$ cd /dir2
/dir2$ cp /dir1/current ./
/dir2$ ./current
COMPILE_DIR=/dir1
0 голосов
/ 27 сентября 2018

Вы можете сделать это с помощью make-файлов, в make-файле добавить макрос, который сохраняет результат pwd:

Makefile:

CFLAGS += -DCURRENT_DIR=\"$(shell pwd)\"

В файле c используйте это значение:

#include <stdio.h>

int main(void)
{
    printf("file %s compiled from %s\n", __FILE__, CURRENT_DIR);
    return 0;
}    
0 голосов
/ 27 сентября 2018

В зависимости от вашего компилятора это может работать:

#include<stdio.h>

int main()
{
  printf("This file path: %s\n", __FILE__);
}

__FILE__ - это предопределенный строковый литерал, который содержит полный путь к файлу .c во время компиляции.

Если выЕсли вам нужен только каталог, вам нужно самостоятельно удалить имя файла с помощью некоторых простых манипуляций со строками.

Это работает в Visual Studio 2017. Я не тестировал его на других платформах.Очевидно на большинстве других платформ __FILE__ просто содержит имя файла без пути.

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