首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/符号中的const数组在具有nm的编译*.o文件中不可见

C/符号中的const数组在具有nm的编译*.o文件中不可见
EN

Stack Overflow用户
提问于 2013-10-30 11:11:36
回答 1查看 698关注 0票数 4

我正在为嵌入式power平台编程(如果这很重要的话,可以使用wind diab编译器),并希望将我的代码与预编译的对象文件*.o (当然是为同一个平台编译)联系起来。其中一个对象文件需要一个外部符号,我必须定义自己,并根据该*.o文件链接-否则链接器会抱怨:

代码语言:javascript
复制
Undefined symbol 'mySymbolName' in file 'precompiled.o'

但是,即使我用缺少的符号编译了一个源文件(预编译的o.*文件期望的签名是:'unsigned char const 16') &将它与预编译的.o链接,链接器仍然会发出抱怨。我的CFile.c:

代码语言:javascript
复制
unsigned char const mySymbolName[16] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

我使用以下命令编译代码:

代码语言:javascript
复制
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是声明的,但从未使用过(当然它不是--它是从另一个对象文件引用的),所以在我看来,这个警告是可以的。与命令链接:

代码语言:javascript
复制
bin/dld   -tPPC5554FF:cross file.dld -o "output.elf"  myObjectFile.o precompiled.o

错误失败:

代码语言:javascript
复制
Undefined symbol 'mySymbolName' in file 'precompiled.o'

使用nm (当然是针对特定的目标平台),我发现我的符号在编译的对象文件中是不可见的: nm只是没有显示任何东西。然而,我找到了一种方式来显示我的符号在纳米。如果我将“const”说明符删除在c文件中,则为:

代码语言:javascript
复制
unsigned char mySymbolName[16] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

nm正确显示mySymbolName。

所以我的问题是:这怎么可能?这是预期的行为,还是在不同平台上的行为不同?ANSI编译器是否允许在编译时删除未引用的const-变量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-30 23:17:12

您的Diab编译器调用似乎是在强制C++编译,const在C++中的语义与C中的语义在数字方式上有所不同。

在C++中,文件范围内的const具有隐式静态(或内部)链接,因此不会放置在对象文件的符号表中。这与C的行为不同,所以如果您使用C编译,它将产生您预期的结果。

添加显式extern声明(或使用C编译):

代码语言:javascript
复制
extern unsigned char const mySymbolName[16] ;

有关更多信息,请参见不久前的 semantics I asked

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19680633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档