我有一個C庫,我使用MinGW32作爲Linux的共享對象和Windows的DLL。 API取決於幾個數據文件(統計模型),我真的很喜歡使用SO/DLL,因此部署只是一個文件。有沒有Linux的「資源文件」等價物?
它看起來像我可以實現這個Windows的「資源文件」與編譯windres
,但後來我必須寫一堆資源處理代碼的Windows,我仍然堅持與文件在Linux上。
有沒有辦法在Linux上實現相同的功能?
更好的是,有沒有便攜式解決方案?
我有一個C庫,我使用MinGW32作爲Linux的共享對象和Windows的DLL。 API取決於幾個數據文件(統計模型),我真的很喜歡使用SO/DLL,因此部署只是一個文件。有沒有Linux的「資源文件」等價物?
它看起來像我可以實現這個Windows的「資源文件」與編譯windres
,但後來我必須寫一堆資源處理代碼的Windows,我仍然堅持與文件在Linux上。
有沒有辦法在Linux上實現相同的功能?
更好的是,有沒有便攜式解決方案?
它實際上是在Linux和其他ELF系統相當簡單:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967
OS X有捆綁,所以你只要建立自己的圖書館作爲一個框架,並把文件中的包。
此方法是否也用於構建Windows DLL?這似乎是一個很好的,簡單的選擇。 – cibyr 2010-01-04 04:19:01
我不知道,我從來沒有爲Windows創建過任何東西,也不知道鏈接器是如何工作的。 – 2010-01-04 04:41:50
您仍然有一個問題,即訪問文件中的數據的API與訪問內存中命名塊的API不同。但如果你能忍受這一點,你就不需要'objcopy';您可以輕鬆編寫一段簡短的腳本,從任何二進制文件生成.c文件。例如,http://www.cs.tufts.edu/~nr/drop/lua/lua2c;使用-s選項運行腳本。 – 2010-01-04 06:42:36
兩個可能的解決方案:
海防VO的sfio庫,這是AT &牛逼先進的軟件技術工具集的一部分,是一個美妙的更換對於C stdio.h
,它可以讓你打開任何文件或使用單個API的內存塊。因此,您可以輕鬆地將現有文件轉換爲C初始化數據,以包含在您的DLL或SO文件中。
這是一個很好的跨平臺解決方案,但其缺點是開始的學習曲線非常高。他們不容易弄清楚東西是如何工作的,或者把它們的工具集的一部分拆分出來以便獨立於其他部分使用。但好消息是,如果你想採用他們的U/Win系統在Windows上運行Unix代碼(同一工具集的所有部分),你可以使用同一個系統創建DLL和SO。
對於這種問題,我經常回退Lua;我可以將Lua數據存儲在外部文件或C中作爲初始化數據。這對於將所有內容分發到一個.so文件非常有用;我爲我的學生做這個。
再次,缺點是你必須掌握和整合新技術。
在我自己的工作中,我使用的Lua在AT &牛逼的東西這些原因:
lua有一個多更小的體積和設計與別人好;與AST你真的採取他們的做事方式。
Lua的學習曲線非常陡峭;您可以非常快速地提高生產力。
Lua很容易安裝,並且很容易獲得關於它的信息。 AST有自己獨特的安裝過程,被世界上其他人所共享;安裝工作通常很困難;並且很難獲得關於它的信息。
使用Lua有很多其他的收益,所以花費在學習Lua和學習如何將Lua整合到C代碼中的努力很容易分攤到多個項目中。
我不明白嵌入腳本語言如何解決嵌入任意文件數據的問題,如果我要嵌入腳本語言,我可能會使用Python(因爲我一直使用Boost.Python無論如何,最近很多)。 sfio看起來很方便,但看起來它可能不值得重構所有使用它的工作。 – cibyr 2010-01-05 03:38:36
@cibyr:我的asnwer承擔什麼嵌入,而不是如何嵌入它。如何將文件嵌入到C代碼中非常非常容易;所有的想法都進入了你想要的字節API的問題。如果你看看http://www.cs.tufts.edu/~nr/drop/lua,你會看到一個名爲'lua2c'的腳本,可能會給你一些想法。使用'-s'選項運行,它會嵌入任何二進制文件,儘管它不是非常有用,因爲我生成的API試圖將文件編譯爲Lua代碼。但是一旦你決定了你想要的API,我相信你可以在Python中做一些事情。如果沒有,發佈另一個問題。 – 2010-01-05 05:54:00
我不知道這是如何遠程接近回答OP問題「有沒有一種方法來添加資源文件與我的可執行文件」(我的解釋)。到目前爲止,objcopy路由似乎比嵌入lua更合理。 – 2013-09-11 17:04:43
相似(可能dup):http://stackoverflow.com/questions/1656968/platform-independant-resource-management和其他可能,但它是一個很難搜索的主題... – dmckee 2010-01-04 03:09:43
不投票關閉,雖然,對現有問題的回答只是勉強有用。 – dmckee 2010-01-04 03:18:13
如果您想告訴我們您要寫入什麼(便攜式)代碼以訪問數據文件,將會非常有幫助。 'fopen'和'fread'根本不會在內存塊上工作,至少不會在我意識到的任何系統上工作。 – 2010-01-05 05:56:12