2017-05-03 68 views
0

考慮以下問題內部,編譯C++函數C++程序

C++程序可以發射一個C++函數的源,例如,說,這將產生具有如下內容的字符串:

std::vector<std::shared_ptr<C>> get_ptr_vec() 
{ 
    std::vector<std::shared_ptr<C>> vec; 
    vec.push_back(std::shared_ptr<C>(new C(val1))); 
    vec.push_back(std::shared_ptr<C>(new C(val2))); 
    vec.push_back(std::shared_ptr<C>(new C(val3))); 
    vec.push_back(std::shared_ptr<C>(new C(val4))); 
    return vec; 
} 

val1等的值將在程序創建上述源代碼的字符串時在運行時確定。這個源文件將寫入一個文件,例如get_ptr_vec.cpp

然後另一個C++程序將需要讀取這個源文件並編譯它,然後調用get_ptr_vec函數並獲取它返回的對象。有點像JIT編譯器。

有什麼辦法可以做到這一點?我認爲一種解決方法是使用腳本來編譯文件,並將其構建到共享庫中。第二個程序可以通過dlopen獲得該功能。然而,有沒有辦法跳過這個並讓第二個程序編譯這個文件(沒有調用system)。請注意,第二個程序在編譯時將無法看到此源文件。事實上,第一個程序可能會有數千個這樣的小源文件。

爲了給出一個小背景,第一個程序將構建一個表達式樹,並通過遍歷後序來序列化樹。樹的每個節點都將有一個字符串表示寫入文件。第二個程序將讀取這個序列化樹節點的列表,並且需要能夠將這個字符串列表重建爲一個C++對象列表(後來從這個列表中我可以重構樹)。

我認爲LLVM框架可能在這裏提供一些東西。有人能給我一些這方面的指示嗎?不需要一個完整的答案,只是我的一個開始的地方。

+0

這非常接近 - 應該關閉:_「要求我們推薦或找到書籍,工具,軟件庫,教程或其他非現場資源的問題與Stack Overflow無關,因爲它們傾向於吸引觀點回答和垃圾郵件,而是描述問題以及迄今爲止解決問題的方法。「_ –

+1

是的,我們通常不會這樣做。我們可能從Python腳本或者C++程序生成C++,但是結果總是通過編譯器正確傳遞。 –

+0

爲此使用某種序列化庫不是更有意義嗎? [Boost :: Serialization](http://www.boost.org/doc/libs/1_64_0/libs/serialization/doc/index.html)也許? –

回答

1

您可以使用clang編譯您的生成代碼併發出LLVM位代碼(-emit-llvm標誌)。然後,將您的程序與部分LLVM靜態鏈接,讀取位碼文件並對它們進行JIT。最後,編譯位碼並在它們上運行JIT,以便它們可以在程序的地址空間中使用。