在 g++ 中定义命名空间对某些文件有效,但对其他文件失败

Defining namespace in g++ works for some files but fails for others

提问人:John Smith V 提问时间:10/20/2021 最后编辑:John Smith V 更新时间:10/27/2021 访问量:170

问:

我将无法显示任何代码,但让我解释一下发生了什么:

我正在尝试用 g++ 编译一些软件;我有我的 Makefile 设置。有一个主文件调用必要的功能来使该软件工作。我所有的依赖项都包括,即所有头文件,所有.cpp源等。

我的问题是,有几个文件要求我定义一个名为 OPTLEVEL 的命名空间,否则 g++ 会出错。

当我这样做时,例如:-DOPTELEVEL=GENERIC,这些文件不再出错,因为我现在定义了 OPTLEVEL;但是,其他几个 .cpp 文件现在出错了,因为我定义了 OPTLEVEL。这都是一个难题,我不知道该怎么办。

下面是一个示例 Makefile,其中包含我如何单独编译源文件;如果我将它们与 Define 合并在一行中,它会给我一个错误。这给了我未定义的参考,正如我在下面解释的那样:

HEADERS_DEFINE_NEEDED = /Header/Needed/Path
HEADERS_NO_DEFINE = /Header/No/Define/Path
SOURCES_DEFINE_NEEDED = define1.cpp define2.cpp
SOURCES_NO_DEFINE = noDefine1.cpp noDefine2.cpp
DEFINITIONS = -DOPTLEVEL=GENERIC

all:
    g++ -c -I$(HEADERS_DEFINE_NEEDED) $(DEFINITIONS) $(SOURCES_DEFINE_NEEDED)
    g++ -c -I$(HEADERS_NO_DEFINE) $(SOURCES_NO_DEFINE)
    g++ *.o -o out

我试图将需要单独定义的 .cpp 文件编译到它们的目标文件中。然后,我将不需要定义的.cpp文件编译为各自单独的目标文件,但是将它们全部链接在一起可以理解地提供未定义的引用。

由于需要的文件,未定义的引用特别出现:定义现在的命名空间类似于 GENERIC::FUNCTION_NAME,没有定义的引用类似于 OPTLEVEL:FUNCTION_NAME

我会接受任何形式的建议。

如果这没有意义,请告诉我,我会尝试澄清。

谢谢!

编辑: 以下是我正在查看的内容的示例: 定义1.cpp

#ifndef OPTLEVEL
#error "Did not define OPTLEVEL 
#endif

namespace OPTLEVEL {
    class SampleClass : public InheritedClass {
        <Code.....>
    }
}
C 生成文件 G++ 未定义引用

评论

2赞 Marek R 10/20/2021
我不是反对者,但宏没有命名空间(至少没有您可以显示的实际代码)。你正在做一些如此奇怪的事情,对我来说这是 XY 问题。通过构建过程中定义的宏更改命名空间名称的理由是什么?
0赞 John Smith V 10/20/2021
这是我得到的软件,正在尝试编译它并将其集成到我自己的软件中;在他们的源代码中,它们具有如下所示的标头保护: #ifndef #error“没有定义 OPTLEVEL #endif 然后在其他文件中,他们有相反的情况。我理解你所说的这是一个 XY 问题,我很感激你指出这一点。这比我想要的要复杂一些。
0赞 John Smith V 10/20/2021
这里有一个问题要问大家:在编译时,有没有办法为某些源文件进行定义,但为其他源文件取消定义?我知道你可以做-DOPTLEVEL=GENERIC *.cpp -UOPTLEVEL,但是当我尝试这样做时,它不起作用。有什么建议吗?如果我让它工作,它可能会解决我的问题。
2赞 Paul Masri-Stone 10/20/2021
当您花时间将问题提炼为一个简洁的问题时,StackOverflow 效果最佳。如果它需要代码来清楚起见,则包含最少的一般情况代码。说“我将无法显示任何代码”会减损并且无济于事。同样,“我会接受任何形式的建议”表明你四处寻找别人来解决你的问题,而不是提出有针对性的问题。最后,StackOverflow 不是一个论坛,所以在评论中提出一个新问题同样没有帮助——要么搜索该问题的答案,要么将其表述为一个新问题。写得很好的问题
0赞 John Bollinger 10/21/2021
当然,代码的某些部分要求在编译时指定命名空间是有特定目的的。我有一些猜测,但您应该阅读项目文档以获取相关信息。我强烈怀疑,某些部分要求在外部定义宏(尽管不一定通过命令行参数),而其他部分要求定义宏,这绝对是故意的。我还认为,对于前一组来源,即使编译器接受它,也可能是非常错误的。-DOPTLEVEL=GENERIC

答:

1赞 John Smith V 10/27/2021 #1

我最初问题的解决方案是将需要定义 OPTLEVEL 的源文件编译到它们自己的库中。然后,在编译main.cpp文件时,我必须确保链接了这些.a,并添加了链接标志,即-llibName。

这需要付出很多努力,但这正是需要做的。