如何静态 link python 解释器?

How to statically link the python interpreter?

这个问题在 Whosebug 上被问过几次。但是,我想要做的有点不同。

我正在尝试将 python 移植到 QNX。编译所有源文件并使用 python c API 将其静态 link 编译为 "Hello World" 脚本。

我的结构模块有问题。我尝试将 struct 编译成共享库并将其放置在 python 指定的 exec_prefix 路径中。当我尝试导入它时,它尝试加载模块,但它抱怨未知符号。

它说的是

Unknown symbol: _PyUnicode_FormatAdvancedWriter referenced by _struct.so

我收到很多这样的未知符号错误。我包含了所有这些未知符号的头文件和源文件,它最终引发了其他未知符号错误。

我可能做错了什么。关于如何 link 他们有什么想法吗?

我正在回答我自己的问题,因为我找到了解决方法。如果其他人遇到同样的问题,您必须在 link 时间将所有符号导出到动态符号 table。为此,您必须将标志 -E 传递给 linker,即 -Wl, -E。那应该可以解决问题。

这是一个 qcc 特定的标志,所以如果您在 gcc 中遇到这个问题,您可以尝试将 --whole-archive 标志传递给 linker。