提问人:John Smith V 提问时间:10/20/2021 最后编辑:John Smith V 更新时间:10/27/2021 访问量:170
在 g++ 中定义命名空间对某些文件有效,但对其他文件失败
Defining namespace in g++ works for some files but fails for others
问:
我将无法显示任何代码,但让我解释一下发生了什么:
我正在尝试用 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.....>
}
}
答:
我最初问题的解决方案是将需要定义 OPTLEVEL 的源文件编译到它们自己的库中。然后,在编译main.cpp文件时,我必须确保链接了这些.a,并添加了链接标志,即-llibName。
这需要付出很多努力,但这正是需要做的。
评论
-DOPTLEVEL=GENERIC