gpt4 book ai didi

c++ - GCC 优化在运行时产生 "Undefined symbol"

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:44 27 4
gpt4 key购买 nike

我现在有一个让我很困惑的问题:我有一段用 C++ 编写的软件,它链接到 C 中的一个库。我使用通常的方式包含头类

extern "C" {
#include <libheader.h>
}

只要我不使用 gcc 的优化,一切都可以正常工作。一旦我什至打开 -O1,因此是第一个优化级别,在运行时我从这个库中得到一个符号的“ undefined symbol ”错误。但是,该名称已经过名称修改,由于 extern "C",应该将其禁用。

调用相关符号的函数是内联的,以防万一。使用的编译器是gcc 4.4.3。

老实说,我什至不知道要搜索什么,所以如果你们中的任何人能给我一些这种行为的理由,我将不胜感激。

感谢您的支持。

最佳答案

你说你在 extern "C" block 中包含了 libheader.h 文件,但是链接器寻找的符号是 name-损坏。

这表明 libheader.h 也被包含在 extern "C" block 之外(包含在 extern "C" block 可能是 nop,因为在 libheader.h 中包含守卫)。

寻找可能包含 libheader.h 的其他方式。 GCC 的 -E 和/或各种 -M 选项可能会或可能不会对此有所帮助。或者(如果只是为了测试)将 extern "C" block 移动到 libheader.h 中:

// at start of libheader.h:
#ifdef __cplusplus
extern "C" {
#endif

/* existing contents of libheader.h */
// ...

// at end of libheader.h:
#ifdef __cplusplus
}
#endif

请注意,链接规范可以嵌​​套,因此您不必删除 #include 站点中现有的 extern "C" block 。

我不知道为什么这个问题只会发生在优化的构建中,除了可能包含调用函数的非内联版本的 .c 或 .cpp 文件获得了正确的标题,并且只需要一个翻译单元将 header 弄错并内联调用函数以查看问题。

关于c++ - GCC 优化在运行时产生 "Undefined symbol",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5486045/

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