【问题标题】:-D option is expanded incorrectly from g++ command line-D 选项从 g++ 命令行错误扩展
【发布时间】:2010-10-18 13:02:31
【问题描述】:

在 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++ 预处理器以不同方式处理。我该如何解决这个问题?

【问题讨论】:

    标签: c++ g++ c-preprocessor codeblocks


    【解决方案1】:

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

    #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】:

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

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

      (这不仅仅是猜测,而是我经常做的事情)

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 试过了,结果和我的版本一样。
        【解决方案4】:

        这似乎可以解决问题。

        g++ -DDATA_DIR='"/media/Shared/SiX/Data"' ...
        

        【讨论】:

          【解决方案5】:

          我刚刚在当前项目的 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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多