考慮以下問題內部,編譯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框架可能在這裏提供一些東西。有人能給我一些這方面的指示嗎?不需要一個完整的答案,只是我的一個開始的地方。
這非常接近 - 應該關閉:_「要求我們推薦或找到書籍,工具,軟件庫,教程或其他非現場資源的問題與Stack Overflow無關,因爲它們傾向於吸引觀點回答和垃圾郵件,而是描述問題以及迄今爲止解決問題的方法。「_ –
是的,我們通常不會這樣做。我們可能從Python腳本或者C++程序生成C++,但是結果總是通過編譯器正確傳遞。 –
爲此使用某種序列化庫不是更有意義嗎? [Boost :: Serialization](http://www.boost.org/doc/libs/1_64_0/libs/serialization/doc/index.html)也許? –