2017-02-22 50 views
8

我有一個大約17 kb長的信息字符串。我的程序不會生成這個字符串或者將它讀入緩衝區 - 數據已經被初始化了,我希望它能夠像我在代碼中那樣被編譯,就像你會用靜態變量一樣。此外,我更喜歡它在我的可執行文件中,而不是存儲在項目文件中。我以前從未遇到過這樣的問題,解決這個問題的最佳方法是什麼?我是否應該將資源包含在內,或者將大量數據複製並粘貼到變量中?你會推薦什麼?在C++中存儲巨大的靜態變量

忘記提到,使用的VisualStudio C++ 2015正在如果該事項

+3

堅持在另一個cpp文件的把一個外部的頭,所以你可以訪問它。這樣一個體面的建設環境不會重建它。 – user4581301

+0

這需要將它存儲在另一個文件中,我不希望文件被放錯地方的風險,並希望能夠直接嵌入.exe – DudeDudeDude

+3

@DudeDudeDude在另一個**'.cpp' **文件中意味着它仍然會被編譯和省略它會給你鏈接錯誤。 – Angew

回答

3

GNU鏈接ld有能力直接包括作爲對象文件的.data部分的自定義數據:

ld -r -b binary -o example.o example.txt 

將所得example.o文件具有定義用於訪問嵌入數據開始和結束的符號(只需查看objdump以查看它們的名稱)即可。

現在我不知道與Visual Studio一起提供的鏈接器是否具有類似的功能,但我猜你可以通過mingw或通過cygwin使用GNU鏈接器(因爲生成的對象文件不會引用標準lib你不需要cygwin自帶的模擬庫)。生成的目標文件apparently can just be added to your sources like a regular source file

當然,這手動工作流程不太好,如果數據經常變化......

或者你可以寫一個簡單的程序,把文件的內容在一個C字符串,如:

unsigned char const * const data = { 
    0x12, 0x34, 0x56 }; 

當然,已經有這樣一個程序(xdd),但我不知道它是否可用。一個潛在的問題是,你可以reach the limit for the length of string literals that way。爲了解決這個問題,你可以嘗試一個(多維)char數組。

(在寫這個答案我發現this blog post非常有幫助。)