C++ 启动C+时出错+;AIX中的可执行文件

C++ 启动C+时出错+;AIX中的可执行文件,c++,aix,C++,Aix,作为应用程序从HP迁移到AIX的一部分,我面临着一个独特的问题。 下面的模拟代码在HP和AIX中产生不同的结果 库.C*** #include <stdio.h> #include "mylib.h" int libimgclientFNXXX() { int check = 100; check = FileNetDeleteDoc(check); return check; } int

作为应用程序从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;
    }
    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内置的完全相同的代码工作正常,没有错误

欢迎您的任何意见

谢谢,

是的,“不使用”库函数可能仍然是一个错误,即使您不打算调用代码。它可能会将某些组件的加载延迟到稍后,因此可能不会导致错误。最好不要引用不存在的东西(或者手动加载库并获取地址,如果函数不存在,您将从“findthefunction”调用中得到一个错误,您可以在代码中执行一些合理的操作)

加载器(加载二进制可执行文件的代码)不是很聪明,所以它不能确切地知道调用了什么和没有调用什么。也有可能不同的编译器在“删除死代码”方面有不同的聪明程度,因此一个编译器完全删除了“从未调用”函数,而另一个编译器没有删除它[因为它没有100%证明您从未调用过该函数的能力-例如,在gcc中,如果您将
libimgclientFNXXX
设置为静态函数,它就会知道这一点-因为它知道静态函数不会在该模块外被调用,而该模块不会使用它。

是的,“不使用”库函数可能仍然是错误的,即使您不打算调用代码。它可能会将某些组件的加载推迟到以后,因此可能不会导致错误。最好不要引用不存在的东西(或手动加载库并获取地址,如果函数不存在,您将从“findthefunction”调用,您可以在代码中执行一些合理的操作)


加载器(加载二进制可执行文件的代码)不是很聪明,因此它无法确切知道调用了什么和没有调用什么。也可能不同的编译器在“死代码删除”方面有不同的聪明程度,因此一个编译器完全删除“从未调用”函数,但另一个编译器不会删除它[因为它没有100%证明您从未调用过该函数的能力-例如,在gcc中,如果您将
libimgclientFNXXX
设置为静态函数,它就会知道这一点-因为它知道静态函数不会在该模块之外被调用,而该模块也不会使用它。

AIX需要在任何时候解析所有符号加载时间,因此即使它构建正常,因为符号被引用,应用程序也不会运行

您需要为.so使用(
-blazy
链接选项),这将导致缺少的函数仅在首次使用时链接


不过,你真的不应该在库中留下未定义的符号——如果它需要来自另一个库的符号,你应该链接到它们(除非它是插件,符号在应用程序本身中公开).AIX需要在加载时解析所有符号,因此即使它构建的是OK,因为符号被引用,所以应用程序也不会运行

您需要为.so使用(
-blazy
链接选项),这将导致缺少的函数仅在首次使用时链接


不过,你真的不应该在库中留下未定义的符号——如果它需要来自另一个库的符号,你应该链接到它们(除非它是插件,符号在应用程序本身中公开).

欢迎使用SO。正如你所见,人们编辑了你的问题,使其更易于阅读和搜索。欢迎使用SO。正如你所见,人们编辑了你的问题,使其更易于阅读和搜索。谢谢大家。使用-blazy将涉及大量更改。我们有100个不同模块的makefiles。有没有办法识别这些“死代码”使我可以从源文件中删除它们?我可以使用nm或任何其他工具来执行此操作吗?nm的问题是,有很多“未定义”的函数是动态链接的。我如何将其与真正的“未定义”区分开来一个?我不确定是否有一种简单的方法来识别哪些模块的符号是“真正的”未定义,哪些没有。我想你可以编写一个脚本,收集你所有的模块和交叉引用,并打印出任何地方都没有定义的东西的名称。谢谢大家。使用-blazy将涉及很多更改。我们有100个不同模块的makefile。有没有办法识别这些“死代码”所以我可以从源文件中删除它们?我可以使用nm或任何其他工具来执行此操作吗?nm的问题是,有很多“未定义”的函数是动态链接的。我如何将其与真正的“未定义”函数区分开来?我不确定是否有一种简单的方法来识别哪些模块具有“真正”的符号我想你可以编写一个脚本来收集你所有的模块和交叉引用,并打印那些没有定义的东西的名字。
$ 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.