【问题标题】:Getting around undefined symbol: _strnicmp绕过未定义的符号:_strnicmp
【发布时间】:2022-08-16 23:37:39
【问题描述】:

我有一个库,它是 C/C++ 库的 python 包装器,需要在 Linux 中导入 Python。让我们打电话给图书馆abc.so。该库依赖于另一个 C/C++ 库:xyz。这两个库曾经拥有/拥有依赖于 Windows、Borland 编译器或类似编译器的工具。在修复了一些与 Windows 编译器相关的问题后,我能够成功构建 abc.so。但是,我无法将其导入我的 python 代码。我收到错误:

ImportError:/usr/local/lib/abc.so:未定义符号:_strnicmp

或此的变体。我尝试了各种导入方法,包括 ctpesossysRTLD_LAZYRTLD_GLOBALRTLD_NOW 等标志,假设导入方法可以解决这个问题。然而,他们都没有工作。这个答案:undefined reference to stricmp(和上面的评论)建议应该替换strnicmp。它还指出这是一个链接时间错误。但是,我无法识别这些库的一部分,期望实现strnicmp。找到此问题根源的好方法是什么?另外,我应该尝试一些替代方法来解决这个问题吗?

  • stricmpstrnicmp 是 Windows 符号; POSIX (Linux) 使用<strings.h> 标头和strcasecmp()strncasecmp()

标签: python c linux windows shared-libraries


【解决方案1】:

stricmp()strnicmp() 函数特定于 Windows。

POSIX (Linux) 使用<strings.h> 标头和strcasecmp()strncasecmp()

您可以编写一个简单的覆盖函数或通过宏更改调用。对于封面函数,您需要使用适当的条件编译(#ifdef SOMETHING / #endif — 或者可能是 #ifndef SOMETHING / #endif)。如果内联函数只出现在一个文件中,您可以使用它。如果它出现在许多文件中,您可能需要一个常规函数,即使它的效率较低。

static inline int strnicmp(const char *s1, const char *s2)
{
    return strcasecmp(s1, s2);
}

或者

#undef strnicmp
#define strnicmp(s1, s2) strcasecmp(s1, s2)

【讨论】:

  • 那么这只是在这些库的源文件中追踪strnicmp 的问题吗?
  • 大多数情况下——但你会想要自动完成,而不是编辑很多文件。例如,您可以将宏或static inline 函数定义添加到包含在所有受影响文件中的一个标头中。
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2019-05-13
相关资源
最近更新 更多