Опция -D неверно раскрыта из командной строки g ++ - PullRequest
3 голосов
/ 18 октября 2010

В проекте C ++ CodeBlocks я добавил следующие определения в настройки проекта, настройки компилятора, #define:

_DEBUG
DATA_DIR=\"/media/Shared/SiX/Data\"

Это приводит к следующей командной строке g ++:

g++ -Wall  -g -fPIC -save-temps -D_DEBUG -DDATA_DIR=\"/media/Shared/SiX/Data\"    -I../Includes  -c /media/Shared/SiX/SiXConfiguration/PathManager.cpp -o obj/Debug/PathManager.o

Thisкод не компилируется:

char* commonDataDir;
#ifdef DATA_DIR
commonDataDir = DATA_DIR;
#endif

Глядя на файл вывода препроцессора, я вижу, что строка исходного кода расширяется следующим образом:

commonDataDir = /media/Shared/SiX/Data;

Я ожидаю:

commonDataDir = "/media/Shared/SiX/Data";

Тот же код правильно скомпилирован из Eclipse CDT:

g++ -D_DEBUG -DDATA_DIR=\"/media/Shared/SiX/Data\" -I"/media/Shared/SiX (copy)/Includes" -O3 -Wall -c -fmessage-length=0 -fPIC -ggdb -MMD -MP -MF"PathManager.d" -MT"PathManager.d" -o"PathManager.o" "../PathManager.cpp"

Итак, один и тот же параметр командной строки обрабатывается пропроцессором g ++ по-разному.Как я могу это исправить?

Ответы [ 5 ]

4 голосов
/ 18 октября 2010

Поместить кавычки в макросы сложно и не очень хорошая идея.
Попробуйте использовать препроцессор, чтобы добавить необходимые кавычки.

#define DO_QUOTE(X)       #X
#define QUOTE(X)          DO_QUOTE(X)

#ifndef DATA_DIR
#define DATA_DIR       /tmp
#endif

char commonDataDir[] = QUOTE(DATA_DIR);
2 голосов
/ 27 ноября 2010

В Code :: Blocks Параметры сборки проекта-> Настройки компилятора -> # определяет

DATA_DIR=\\"/media/Shared/SiX/Data\\"

(Это не просто предположение, а то, что я делаю регулярно)

0 голосов
/ 26 апреля 2018

Я просто использовал строку, похожую на -DDATA_DIR=\"/media/Shared/SiX/Data\" внутри файла make в текущем проекте, и она работала просто отлично. (Одиночная обратная косая черта и двойные кавычки.)

Окружающая среда:

> uname -a
Linux ... 3.16.0-5-amd64 #1 SMP Debian 3.16.51-3+deb8u1 (2018-01-08) x86_64 GNU/Linux
> make -v
GNU Make 4.0
Built for x86_64-pc-linux-gnu
> g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ...
Thread model: posix
gcc version 4.9.2 (Debian 4.9.2-10+deb8u1)
0 голосов
/ 18 октября 2010

Это, кажется, исправить.

g++ -DDATA_DIR='"/media/Shared/SiX/Data"' ...
0 голосов
/ 18 октября 2010

Вам необходимо заключить всю строку в "

-DDATA_DIR="\"/media/Shared/SiX/Data\""
           ^                          ^
...