在我们的应用程序从 HP 迁移到 AIX 的过程中,我遇到了一个独特的问题。 以下模拟代码在 HP 和 AIX 中产生不同的结果。
库.C **
#include <stdio.h>
#include "mylib.h"
int libimgclientFNXXX()
{
int check = 100;
check = FileNetDeleteDoc(check);
return check;
}
int libimgclientFN()
{
int check = 1;
printf("In lib ");
return check;
}
* main_func.C *
#include <stdio.h>
int libimgclientFN();
int libimgclientFNXXX();
int main()
{
int one = 0;
if (1 == 1)
{
one = libimgclientFN();
}
printf("\n The status is %d \n", one);
}
* mylib.h **
extern int FileNetDeleteDoc (int);
请注意,函数 libimgclientFNXXX() 从未被调用。 我的make文件如下:
xlC -c -g library.C -o library.o -I./
xlC -G -qmkshrobj -o libImgClient.so library.o
xlC -c -g -qpic=small main_func.C -o main_func.o
xlC -brtl main_func.o -L. -lImgClient -o TST
当我运行 TST 时,出现以下加载错误
$ TST
exec(): 0509-036 Cannot load program TST because of the following errors:
rtld: 0712-001 Symbol FileNetDeleteDoc__Fi was referenced
from module ./libImgClient.so(), but a runtime definition
of the symbol was not found.
即使函数 libimgclientFNXXX() 从未被调用,仍然存在 Unresolved 错误。
HP 中内置的完全相同的代码运行良好,没有错误。
欢迎任何意见。
谢谢
最佳答案
是的,“不使用”库函数仍然可能是一个错误,即使您不打算调用代码。它可以将某些组件的加载推迟到稍后,因此它可能不会导致错误。最好不要引用不存在的东西(或者手动加载库并获取地址,如果该函数不存在,您将从“查找函数”调用中收到错误,您可以执行某些操作代码中合理)。
加载器(加载二进制可执行文件的代码)不是很聪明,因此它无法确切知道什么正在被调用,什么没有被调用。也有可能不同的编译器对于“死代码删除”有不同程度的聪明,因此一个编译器完全删除了“从未调用”的函数,但另一个编译器没有删除它[因为它没有 100% 证明的聪明你永远不会调用该函数 - 例如,在 gcc 中,如果你将 libimgclientFNXXX 设为静态函数,它就会知道这一点 - 因为它知道静态函数不会在该模块之外被调用,并且该模块没有使用它。
关于c++ - 在 AIX 中启动 C++ 可执行文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14023754/