我正在尝试使用g ++ 4.4.5在Ubuntu中编译一个名为SNoW的系统。该软件似乎最后一次更新为g ++ 3.1.4,因为我发现其中一个文件中有一个切换检查它,最高的情况是3.1.4 +。
我不得不更新一些标头以获取编译器错误... cstring而不是字符串和类似的东西。现在我停留在未定义的引用错误上,其中未定义的引用是提供的头中的函数。
错误是这样的:
Main.o: In function `ShowUsage(char const*)':
Main.cpp:(.text+0x140e): undefined reference to `Fex::logo'
...来自Main.cpp:
cerr << Fex::logo[0] << endl;
其中Fex.h包含在Main.cpp的顶部,而Fex.h中Fex类的 public 成员之一是:
static const char * logo[];
Main.o的Makefile因此是:
fex : Main.o
$(CC) -O2 -o fex Main.o $(LINKFLAGS)
Main.o : Main.cpp FexGlobalParams.h Fex.h libfex.a
$(CC) $(CCFLAGS) -o Main.o Main.cpp
我已经尝试将CC设置为repos(4.3)中最早版本的g ++,并重新排序Makefile中的标题但没有成功,并且我不确定此时该做什么。我找不到g ++ 3.1的现存副本,并且软件创建者非常确信它是在上次使用它时在Linux下编译的。
有没有人发现可能出错的地方,或者有什么建议可以尝试?
答案 0 :(得分:3)
虽然静态成员的声明可能在Fex.h
标题中,但是某个成员需要有一个定义(通常它位于Fex.cpp
文件):
const char * Fex::logo[ /* you'll need some size here, too */ ];
我似乎记得GCC会自动为这些“幽灵”静态成员制定定义 - 也许他们已经改变了(或添加了编译器选项)? - 我在想GCC assuming that statically allocated arrays without a specified size would default to one element,但那只是C。