C++ 的 AIX xlC 交叉编译/链接未找到 C 符号

Posted

技术标签:

【中文标题】C++ 的 AIX xlC 交叉编译/链接未找到 C 符号【英文标题】:AIX xlC cross-compilation/linkage for C++ not finding C symbols 【发布时间】:2011-02-10 17:40:32 【问题描述】:

我正在尝试在 AIX 上使用 xlc/xlC 编译器进行交叉编译。

代码在另一台机器上使用默认设置时编译成功。代码实际上通过交叉编译成功编译,但问题来自链接器。这是将对象链接在一起的命令:

$(CHILD_OS)/usr/vacpp/bin/xlC -q32 -qnolib -brtl -o $(EXECUTABLE) $(OBJECT_FILES)   
-L$(CHILD_OS)/usr/lib  
-L$(CHILD_OS)/usr/vacpp/lib/profiled  
-L$(CHILD_OS)/usr/vacpp/lib  
-L$(CHILD_OS)/usr/vac/lib  
-L$(CHILD_OS)/usr/lib  
-lc -lC -lnsl -lpthread  
-F$(CHILD_OS)$(CUSTOM_CONFIG_FILE_LOCATION)

当我尝试链接代码时,我得到了几个未定义的符号: .setsockopt(int,int,int,const void*,unsigned long), .socket(int,int,int), .connect(int,const sockaddr*,unsigned long) 等

我发现缺少的符号来自标准 c 库 libc.a。当我用 nm 查找正在拾取的 libc.a 的符号时,这些符号确实存在。我猜测 C++ 无法读取 C 对象可能存在问题,但我真的是在黑暗中拍摄。

【问题讨论】:

【参考方案1】:

听起来可能是 C++ 名称修改问题。

在目标文件上运行nm 以找出他们正在寻找的符号。然后将确切的名称与库进行比较。

然后检查编译命令,以确保包含正确版本的头文件 - 可能是错误地包含了父操作系统的副本?

【讨论】:

我怀疑是否包含了父操作系统的头文件(-qnolib 和 -qnostdinc 与 xlc/xlC 等效)。我确实在包含的库目录下对 libc.a 运行了 nm,并找到了所有符号。不幸的是,好的建议已经尝试过了。 我建议对目标文件运行 nm,以找出正在寻找的真正符号 - xlc 列出的符号看起来像 C++ 参考的解构版本。【参考方案2】:

我最终能够解决这个问题。看起来我正在为 .c 文件使用 C++ 编译器。对 C 文件使用 xlc 编译器而不是 xlC 编译器解决了这个问题。

【讨论】:

以上是关于C++ 的 AIX xlC 交叉编译/链接未找到 C 符号的主要内容,如果未能解决你的问题,请参考以下文章

使用xlC 13.1.2在AIX 7.1上编译boost C ++库

sigsegv 发生在 posix_memalign 在某些设备中释放后立即发生并在 AIX 中编译选项

Xlc '-qthreaded' 编译器选项的 gcc 等效项是啥?

参数类型对于此链接类型的函数无效

如何在Unix 下运行c语言?

AIX 服务器 6.1 中的 ActiveMQ C 客户端