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 中编译选项