簡體   English   中英

編譯python模塊擴展時如何靜態鏈接庫

[英]How to statically link a library when compiling a python module extension

我想修改 setup.py 文件,以便命令“python setup.py build”編譯靜態(而不是動態)鏈接到庫的基於 C 的擴展模塊。

該擴展目前動態鏈接到許多庫。 除了靜態鏈接到一個庫之外,我想保持一切不變。 我已經通過手動修改 distutils 運行的 gcc 調用成功地做到了這一點,盡管它要求我明確列出依賴庫。

也許這是太多信息,但為了清楚起見,這是在“python setup.py build”腳本期間執行的最終鏈接命令:

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib -ligraph -o build/lib.linux-x86_64-2.7/igraph/core.so

這是我的手動修改:

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib /system/lib/libigraph.a -lxml2 -lz -lgmp -lstdc++ -lm -ldl -o build/lib.linux-x86_64-2.7/igraph/core.so

Distributing Python Modules 的第 2.3.4 節討論了庫的規范,但只有“library_dirs”是合適的,並且這些庫是動態鏈接的。

我正在使用 Linux 環境進行開發,但該軟件包也將在 Windows 上編譯和安裝,因此我所追求的是可移植的解決方案。

有人可以告訴我在哪里可以找到說明,或者如何修改 setup.py 腳本? (提前致謝!)

我是 StackOverflow 的新手,所以如果我沒有正確標記這個問題,或者我在這篇文章中犯了一些其他錯誤,我深表歉意。

6 到 7 年后,使用 Python 擴展進行靜態鏈接的文檔仍然很少。 正如 OP 在評論中指出的那樣,用法取決於操作系統。

在 Linux / Unix 上

靜態庫就像目標文件一樣鏈接,應該與路徑及其擴展名一起使用extra_objects

在 Windows 上

編譯器查看鏈接庫是靜態的還是動態的,靜態庫名稱轉到庫列表,目錄轉到 library_dir

兩個平台的解決方案

對於下面的示例,我將使用與 OP 相同的庫場景,鏈接igraph靜態和zxml2gmp動態。 這個解決方案有點駭人聽聞,但至少對每個平台都是正確的。

static_libraries = ['igraph']
static_lib_dir = '/system/lib'
libraries = ['z', 'xml2', 'gmp']
library_dirs = ['/system/lib', '/system/lib64']

if sys.platform == 'win32':
    libraries.extend(static_libraries)
    library_dirs.append(static_lib_dir)
    extra_objects = []
else: # POSIX
    extra_objects = ['{}/lib{}.a'.format(static_lib_dir, l) for l in static_libraries]

ext = Extension('igraph.core',
                 sources=source_file_list,
                 libraries=libraries,
                 library_dirs=library_dirs,
                 include_dirs=include_dirs,
                 extra_objects=extra_objects)

在 MacOS 上

我想這也適用於 MacOS(使用else路徑),但我還沒有測試過。

如果所有其他方法都失敗了,那么Extension構建器總會有記錄很少的extra_compile_argsextra_link_args選項。 (另見此處。)

不過,您可能需要修改一些與操作系統相關的代碼才能為特定平台獲取正確的參數格式。

這可能有效嗎?

g++ -Wl,-Bstatic -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM