在 g++ 中定义命名空间适用于某些文件,但对其他文件无效
Defining namespace in g++ works for some files but fails for others
我无法显示任何代码,但让我解释一下发生了什么:
我正在尝试用 g++ 编译一些软件;我有我的 Makefile 设置。有一个主文件调用必要的函数来使该软件工作。我拥有所有依赖项,即所有头文件、所有 .cpp 源等。
我的问题是,有几个文件要求我定义 一个名为 OPTLEVEL 的命名空间,否则会出现 g++ 错误。
当我这样做时,例如:-DOPTELEVEL=GENERIC,这些文件不再出错,因为我现在定义了 OPTLEVEL;但是,由于我定义了 OPTLEVEL,其他几个 .cpp 文件现在出错了。这是一个难题,我不知道该怎么办。
这是一个 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.
我会采纳任何建议。
如果这没有意义,请告诉我,我会尽力澄清。
谢谢!
编辑:
这是我正在查看的示例:
define1.cpp
#ifndef OPTLEVEL
#error "Did not define OPTLEVEL
#endif
namespace OPTLEVEL {
class SampleClass : public InheritedClass {
<Code.....>
}
}
我最初的问题的解决方案是将需要定义 OPTLEVEL 的源文件编译到它们自己的库中。然后在编译 main.cpp 文件时,我必须确保我链接了那些 .a,并添加了链接标志,即 -llibName.
费了很大力气,但这正是需要做的。
我无法显示任何代码,但让我解释一下发生了什么:
我正在尝试用 g++ 编译一些软件;我有我的 Makefile 设置。有一个主文件调用必要的函数来使该软件工作。我拥有所有依赖项,即所有头文件、所有 .cpp 源等。
我的问题是,有几个文件要求我定义 一个名为 OPTLEVEL 的命名空间,否则会出现 g++ 错误。
当我这样做时,例如:-DOPTELEVEL=GENERIC,这些文件不再出错,因为我现在定义了 OPTLEVEL;但是,由于我定义了 OPTLEVEL,其他几个 .cpp 文件现在出错了。这是一个难题,我不知道该怎么办。
这是一个 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.
我会采纳任何建议。
如果这没有意义,请告诉我,我会尽力澄清。
谢谢!
编辑: 这是我正在查看的示例: define1.cpp
#ifndef OPTLEVEL
#error "Did not define OPTLEVEL
#endif
namespace OPTLEVEL {
class SampleClass : public InheritedClass {
<Code.....>
}
}
我最初的问题的解决方案是将需要定义 OPTLEVEL 的源文件编译到它们自己的库中。然后在编译 main.cpp 文件时,我必须确保我链接了那些 .a,并添加了链接标志,即 -llibName.
费了很大力气,但这正是需要做的。