【发布时间】:2010-06-21 20:22:23
【问题描述】:
我很乐意帮助诊断我在尝试使用 g++ 4.2.1 编译时收到的重复符号错误的来源。
具体错误是
ld: duplicate symbol _SOCIODEM_FILENAMES in /var/folders/c+/c+eq1Qz1Feye7vxs5mQOUE+++TI/-Tmp-//ccP3yVgF.o and /var/folders/c+/c+eq1Qz1Feye7vxs5mQOUE+++TI/-Tmp-//cc1NqtRL.o
collect2: ld returned 1 exit status
仅当我将此声明包含在名为 Parameters.h 的文件中时才会发生错误:
// Parameters.h
#ifndef PARAMETERS_H
#define PARAMETERS_H
// ...[code snipped]...
const int NUM_SOCIODEM_FILES = 5;
const char * SOCIODEM_FILENAMES[ NUM_SOCIODEM_FILES ] = { "LSPAN_PDF.txt",
"FLEDGE_PDF.txt",
"PAIR_PDF.txt",
"BIRTH_AGE_PDF.txt",
"SPLIT_PDF.txt" };
// ...[code snipped]...
#endif
我已经搜索了我的所有文件,这是唯一声明 SOCIODEM_FILENAMES 的地方。当我注释掉声明时,“重复符号”错误消失了。
我不熟悉链接器错误(如果是这样的话),希望能帮助我解决问题。我所有的头文件都有#ifndef...#define...#endif 包装器。我的编译命令是
g++ -o a.out -I /Applications/boost_1_42_0/ Host.cpp Simulation.cpp main.cpp Rdraws.cpp
提前致谢。
解决方案总结
我现在在Parameters.h中:
const char * const SOCIODEM_FILENAMES[ NUM_SOCIODEM_FILES ] = { "LSPAN_PDF.txt",
"FLEDGE_PDF.txt",
"PAIR_PDF.txt",
"BIRTH_AGE_PDF.txt",
"SPLIT_PDF.txt" };
Parameters.h 中的所有其他定义和声明均未更改。 Andrey 和其他评论者总结了一种使用 extern 的替代方法,这对我的目的来说太过分了。
【问题讨论】:
-
太棒了。但是我仍然不明白为什么您不将
SOCIODEM_FILENAMES数组声明为const。数组条目是否应该在运行时更改? -
@Andrey:我应该将它们声明为常量。谢谢。