2017-05-25 53 views
0

我有(load "foo.import.scm")當我編譯一切工作,只要我從同一個目錄執行程序。否則,它抱怨不能夠找到 「foo.import.scm」我如何在二進制可執行文件中包含雞模塊

Error: (open-input-file) cannot open file - No such file or directory: "foo.import.scm" 

,如果我做

csc -s foo.scm -emit-import-library foo 

然後

(import foo) 

它編譯罰款,但隨後抱怨

Error: (require) cannot load extension: foo 

當從一個不同的目錄

,如果我做

(use foo) 

則抱怨

Error: (require) cannot load extension: foo 

,當我從一個不同的目錄中運行它。

將此模塊加載到我的程序中的正確方法是什麼,它將包含在可執行文件中?應該通過一個不同的標誌csc?文檔沒有讓我明白這個解決方案。

回答

0

load根據定義是運行時間的事情。這基本上是(eval (cons 'begin (read-all)))(與警告說,雞還可以load二進制.so文件)。 load將始終從當前目錄加載,除非使用絕對路徑。

如果您想在編譯的程序中使用該模塊,請不要加載導入庫;當(use)對應的模塊時,編譯器會自動做到這一點。

也許你可以更多地解釋一下你的項目結構?問題並不清楚在哪裏。

+0

項目結構:3個文件在相同的目錄中'main.scm''foo.scm''foo.import.scm' 然後'csc main.scm'我想要生成的可執行文件從其他目錄中工作。我已經嘗試'導入''加載'和'使用'和所有本地工作,但不執行其他目錄時,我執行生成的二進制文件。 – masukomi

+0

有幾種方法可以做到這一點:1)將'foo'安裝爲全局擴展名,以便找到它。 2)使用[部署模式](http://wiki.call-cc.org/man/4/Deployment)將'foo'作爲擴展名安裝到本地目錄中,並將'rpath'設置爲該目錄。 3)使用'-private-repository'來設置'rpath'以匹配它所在的目錄。 4)分別編譯你的程序,並將其作爲單元鏈接在一起(參見[手冊中的多文件示例](http://wiki.call-cc.org/man/4/Using%20the%20compiler#an-例如與 - 多文件))。 – sjamaan

相關問題