1

我正在 HPUX 上构建一些东西。代码在 Sun/Linux/AIX 中运行良好。

但是在 HPUX 上它抱怨

[sshexec] /usr/ccs/bin/ld: Unsatisfied symbols:
[sshexec]    globalVar (first referenced in blah.o)

代码再次在 Release 中有效,但在 Debug 中无效。它所做的一切都是使用在其他文件中定义的全局变量

extern globPck globalVar;

globPck 是包含一些全局内容的类。

我对想法更感兴趣,这可能是它在 Release 中工作但在 Debug 中不起作用的原因。

我查看了 .i 文件(使用 -E 生成的预编译头文件),它似乎以相同的方式定义。

我猜在发布代码路径中遇到的问题修复了它,但我在这里是想听听你们是否有一些想法。

4

2 回答 2

3

当链接器抱怨某些东西没有定义时,要做的第一件事就是自己去寻找那个东西在哪里定义的。如果你找不到它,那么也不要指望链接器找到它。

你所展示的是一个声明,而不是一个定义。定义将没有extern关键字。项目中的一个.cpp文件中应该有一个定义,而不是标题。

一旦你找到了定义,你就可以开始研究为什么链接器看不到它。也许它仅在存在某些符号时才定义,例如DEBUGor NDEBUG

如果没有定义,那么在发布编译期间可能会删除它的所有使用(可能因为所有使用都发生在assert编译器省略的语句中),因此在发布模式下不会注意到缺少的定义。

于 2011-01-04T21:02:35.337 回答
0

如果仅从主执行路径间接访问类,则 HPUX 编译器喜欢“优化”对全局类的构造函数调用。尝试在主线程中的某处添加一个带有变量值的简单 printf() ,看看问题是否消失。

于 2014-05-14T13:33:19.460 回答