3

在 C++ CodeBlocks 项目中,我在项目设置、编译器设置、#define 中添加了以下定义:

_调试
DATA_DIR=\"/媒体/共享/SiX/数据\"

这将产生以下 g++ 命令行:

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

此代码无法编译:

char* commonDataDir;
#ifdef 数据目录
commonDataDir = DATA_DIR;
#万一

查看预处理器输出文件,我看到源代码行以这种方式扩展:

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++ 处理器以不同方式处理。我怎样才能解决这个问题?

4

5 回答 5

4

在宏上加上引号很棘手,而且不是一个好主意。
尝试使用预处理器添加所需的引号。

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

#ifndef DATA_DIR
#define DATA_DIR       /tmp
#endif

char commonDataDir[] = QUOTE(DATA_DIR);
于 2010-10-18T13:13:14.417 回答
2

在 Code::Blocks项目构建选项->编译器设置->#defines

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

(这不仅仅是一个猜测,而是我经常做的)

于 2010-11-26T23:50:26.143 回答
0

您需要将整个字符串包含在"

-DDATA_DIR="\"/media/Shared/SiX/Data\""
           ^                          ^
于 2010-10-18T13:05:53.997 回答
0

这似乎可以解决它。

g++ -DDATA_DIR='"/media/Shared/SiX/Data"' ...
于 2010-10-18T13:08:33.163 回答
0

我只是在当前项目的 make 文件中使用了类似的行-DDATA_DIR=\"/media/Shared/SiX/Data\",它工作得很好。(单反斜杠和双引号。)

环境:

> 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)
于 2018-04-25T21:53:36.127 回答