gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:12:09 26 4
gpt4 key购买 nike

作为我们从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com