2013-05-22 58 views
4

我應該如何在OpenBSD建立一個XS的Perl模塊時所需的.so文件丟失?建立一個perl擴展模塊上的OpenBSD

背景:在OpenBSD 5.3 vm安裝版中,我無法構建需要鏈接到-lpthread的perl模塊。 pthread.a和pthread.so.Maj.Min 系統上存在。

但是Makefile.PL正在尋找pthread.so,這是不存在的。這對OpenBSD來說是普通的嗎? (我可以強制Makefile與pthread.a進行鏈接,並且事情很好,因爲它發生了。)

在Redhat-ish Linux環境中,我只需安裝正確的-devel RPM並再次運行。然而,在OpenBSD上,我錯過了一些關於開發環境的基礎知識。

UPDATE核心問題是Dynaloader錯誤檢測Makefile.PL中的庫。

回答

0

的Makefile文件是錯誤的,向上遊報告錯誤。它永遠不應該尋找一個特定的文件。看這個例子:

$ cat test.c    
int main(){ 
    return 0; 
} 
$ gcc -lpthread -o test test.c 
$ ldd test 
test: 
    Start   End    Type Open Ref GrpRef Name 
    00000c4321600000 00000c4321a02000 exe 1 0 0  test 
    00000c4521f63000 00000c4522374000 rlib 0 2 0  /usr/lib/libpthread.so.17.1 
    00000c4524c1c000 00000c4525103000 rlib 0 1 0  /usr/lib/libc.so.68.2 
    00000c452a100000 00000c452a100000 rtld 0 1 0  /usr/libexec/ld.so 

另外,在OpenBSD中,你不需要安裝-devel包。 OpenBSD包含了電池。

+0

是的;其他的東西是不對的 - 有Dynaloader魔術探測到了被破壞的圖書館。足夠近。 – pilcrow

0

您在編輯Makefile.PL是一條路可走,我一般看到人們使用鏈接文件指向通用庫/可執行名稱的版本具體名稱。

For Example: 
    pthread.so -> pthread.so.maj.min 
    pthread.so.maj -> pthread.so.maj.min 

這樣的事情,希望「最新」版本可以通過鏈接&得到它認爲,只關心主要版本可以抓住最新發布它的主要版本...

+0

權,但不能對這種事情的標準做法。你將如何動態編譯一個用戶程序對抗pthread - 每次手工製作正確的符號鏈接?這看起來不正確。 – pilcrow

+0

似乎並正確我不會。我通常會看到它由Distro Vendor/Package Author/Makefile完成。不能說這是個好主意,只是報告我見過的內容。 – tjd