如何静态 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。
这个问题在 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。