作为从HP到AIX的应用程序迁移的一部分,我面临一个独特的问题。
以下模拟代码在HP和AIX中产生不同的结果。

库。 **

    #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(),也存在未解决的错误。

HP内置的完全相同的代码可以正常工作,没有任何错误。

任何输入表示赞赏。

谢谢,

最佳答案

是的,即使您不打算调用代码,“不使用”库函数仍然可能是一个错误。它可以将某些组件的加载推迟到以后,这样就不会导致错误。最好不要引用不存在的内容(或手动加载库并获取地址,如果函数不存在,则会从“查找函数”调用中得到错误,并且可以执行某些操作在代码中明智)。

加载程序(加载二进制可执行文件的代码)不是很聪明,因此它无法确切知道正在调用什么,什么不是。不同的编译器对于“死代码删除”的智能程度也可能不同,因此一个编译器会完全删除“从未调用”功能,而另一个编译器不会将其删除(因为没有100%认证的智能能力)永远不要调用该函数-例如在gcc中,如果将libimgclientFNXXX设置为静态函数,它将知道此信息-因为它知道静态函数不会在该模块之外被调用,并且该模块未使用它。

关于c++ - 在AIX中启动C++可执行文件时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14023754/

10-09 06:01
查看更多