2011-06-23 49 views
2

我有一個我在C++中創建的包,並已將其編譯到共享庫中。如何讓python識別讀取預編譯的共享文件?

當我用自己的主函數鏈接它時,我可以通過直接調用初始化函數初始化包,initfoo和一切工作正常。

我如何得到蟒蛇承認我的共享庫作爲一個整體,這樣我就可以鍵入:從常規Python解釋器運行

import foo 

我對使用distutils編譯文件不感興趣,因爲編譯必須是常規cmake編譯系統的一部分。我只需要創建加載共享庫所需的任何包文件。

更新: 我現在有它的工作。問題在於cmake默認爲共享庫名稱的lib前綴。爲了解決這個問題,需要

SET_TARGET_PROPERTIES(foo PROPERTIES PREFIX "") 

,併爲Mac OS X

SET_TARGET_PROPERTIES(foo PROPERTIES SUFFIX ".so") 
+0

'distutils'具體存在是因爲它可以讓你自己做很大的麻煩(參見http://python-history.blogspot.com/2009/03/dynamically-loaded-modules.html) - 正在用' distutils'(可能兩次,如果它在cmake構建中也需要)完全沒有問題? – delnan

+0

這是不可能的。我的命令調用了很多C++函數。另外,在Mac OS X上,生成的共享庫必須鏈接到所有其他共享庫。 – Juan

回答

2

如果你有initfoo符號的共享庫導出(注:因爲你加了標籤的問題 - 確保它是一個extern "C"符號,否則名稱修改將阻止解釋器找到它),那麼它已經是一個Python模塊,並且可以直接加載,而無需進一步的工作。您只需確保它在搜索路徑上,就像其他任何模塊一樣。

+0

謝謝。我將PYTHONPATH變量設置爲$ PWD,並驗證了「initfoo」函數是否已解除並且在符號表中。事實證明,.so文件名必須是foo.so,而不是libfoo.so。謝謝。 – Juan