在AIX中启动c++可执行文件时出错
Error launching C++ executable in AIX
在将应用程序从HP迁移到AIX的过程中,我遇到了一个独特的问题。下面的模拟代码在HP和AIX中产生不同的结果。
library.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()从未被调用,也有未解决的错误。
在HP中构建的完全相同的代码工作得很好,没有错误。
欢迎您的参与。
谢谢,
是的,"不使用"库函数可能仍然是一个错误,即使你不打算调用代码。它可能会延迟某些组件的加载,所以它可能不会导致错误。最好不要引用不存在的东西(或者手动加载库并获取地址,如果函数不存在,你会从"查找函数"调用中得到一个错误,你可以在代码中做一些明智的事情)。
加载器(加载二进制可执行文件的代码)不是很聪明,所以它不能确切地知道什么被调用了,什么没有被调用。也有可能不同的编译器有不同水平的聪明"死代码消除",所以一个编译器完全消除了"从未被称为"功能,但另一个编译器不能删除它(因为它不是有聪明100%保证你永远不会调用该函数——例如,在gcc会知道如果你让libimgclientFNXXX
静态函数,因为它知道静态函数不被调用此模块外,和这个模块不使用它。
AIX要求在加载时解析所有符号,因此即使它可以正常构建,但由于符号被引用,应用程序将无法运行。
您需要为.so (-blazy
链接选项)使用延迟链接,这应该导致丢失的函数仅在第一次使用时被链接。
你真的不应该在库中留下未定义的符号,但是-如果它需要来自另一个库的符号,你应该链接到它们(除非它是一个插件,其中的符号在应用程序本身暴露)。
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 linux 可执行文件中使用静态库
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 编译的C可执行文件被Windows defender检测为病毒
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 在 Qt 中将 x 可执行文件作为按钮事件运行时出错
- 可执行文件在运行时出错
- 将 CLANG 构建的可执行文件与 G++-v6 构建的 Boost 库链接时出错
- 编译后可执行文件出错
- 链接器在编译使用Boost的可执行文件时出错.使用Boost.Thread链接到静态库的线程
- 在AIX中启动c++可执行文件时出错