我正在为嵌入式power平台编程(如果这很重要的话,可以使用wind diab编译器),并希望将我的代码与预编译的对象文件*.o (当然是为同一个平台编译)联系起来。其中一个对象文件需要一个外部符号,我必须定义自己,并根据该*.o文件链接-否则链接器会抱怨:
Undefined symbol 'mySymbolName' in file 'precompiled.o'但是,即使我用缺少的符号编译了一个源文件(预编译的o.*文件期望的签名是:'unsigned char const 16') &将它与预编译的.o链接,链接器仍然会发出抱怨。我的CFile.c:
unsigned char const mySymbolName[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};我使用以下命令编译代码:
bin/dplus -g -Xdebug-dwarf3 -W:c++:.c -Xc++-abr -Xmake-dependency=0xd -Xsmall-data=0 -Xsmall-const=0 -Xlint=0x40 -O -tPPC5554FF:cross -I{some include pathes...} -DTOOL_FAMILY=diab -DTOOL=diab -DPowerPC -DPPC5500 -o "myObjectFile.o" -c "myCFile.c"编译器警告我,mySymbolName是声明的,但从未使用过(当然它不是--它是从另一个对象文件引用的),所以在我看来,这个警告是可以的。与命令链接:
bin/dld -tPPC5554FF:cross file.dld -o "output.elf" myObjectFile.o precompiled.o错误失败:
Undefined symbol 'mySymbolName' in file 'precompiled.o'使用nm (当然是针对特定的目标平台),我发现我的符号在编译的对象文件中是不可见的: nm只是没有显示任何东西。然而,我找到了一种方式来显示我的符号在纳米。如果我将“const”说明符删除在c文件中,则为:
unsigned char mySymbolName[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};nm正确显示mySymbolName。
所以我的问题是:这怎么可能?这是预期的行为,还是在不同平台上的行为不同?ANSI编译器是否允许在编译时删除未引用的const-变量?
发布于 2013-10-30 23:17:12
您的Diab编译器调用似乎是在强制C++编译,const在C++中的语义与C中的语义在数字方式上有所不同。
在C++中,文件范围内的const具有隐式静态(或内部)链接,因此不会放置在对象文件的符号表中。这与C的行为不同,所以如果您使用C编译,它将产生您预期的结果。
添加显式extern声明(或使用C编译):
extern unsigned char const mySymbolName[16] ;有关更多信息,请参见不久前的 semantics I asked。
https://stackoverflow.com/questions/19680633
复制相似问题