c++ - 在 AIX 中启动 C++ 可执行文件时出错

标签 c++ aix

在我们的应用程序从 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/

相关文章:

c++ - 什么时候在空实例上调用成员函数会导致未定义的行为?

c++ - 成员 "extra qualification ‘student::’ [-fpermissive] 上的错误 ‘student’ “

c++ - 任何可用于将 SDL 库添加到 Visual Studio 2012 的教程?

c - AIX 相当于 ieee754.h

aix - IBM AIX 中 objdump 的等效命令是什么

c++ - 括号之间的两个字符串在 C++ 中用逗号分隔

c++ - 试图从内存中删除字符串。不会让我分配给 cin

ssl - AIX证书导入错误

linux - 如何将 echo/print 命令与另一个命令(如 cat 或 sed)结合使用

java - 如何在 ibm java 8 中启用 SSLv3 设置