2011-12-12 60 views
2

在我的程序中,我需要調用一個子進程* sub_prog *。我通過系統調用來做到這一點,例如system("sub_prog arg1 arg2...");。夠簡單;所有工作正常。不幸的是,我使用的超級計算機不支持子進程的產生(由於架構,你不能在MPI中使用fork(),popen()等),這只是一個事實。因此,解決方案是將* sub_prog *(共享)庫作爲庫函數調用,而不是作爲子進程。從獨立程序創建共享庫 - 如何處理「int main()」?

我創建了共享庫* libsub_prog.so *很好。問題是 - 我想要調用的函數是* sub_prog *本身,即,我想調用sub_progmain(argc,argv)

有關共享庫的問題通常集中在共享庫的成員函數調用中。但是如果我想調用主要的函數本身呢?

(我想過重命名* SUB_PROG *的int main到另一個名稱,實際上把它main逼到另一個成員函數。但也有int main前右deefined幾個全局變量)。我是否必須將這些放在標題globals.h中,然後在每個源文件中手動插入「#include globals.h」?)

感謝所有提前。

+0

使用'dlsym'有什麼問題? –

+1

這超出了std C++的範圍,因此請爲您的環境添加相應的標記。 –

+0

將main重命名爲其他內容沒有任何問題;你似乎對全局變量有一些誤解,你的擔憂似乎沒有任何意義。 – wolfgang

回答

1

我只是通過給它一個不同的名稱將它變成一個正常的函數,並使用這個新名稱從主可執行文件中調用它。如果聲明函數具有extern "C"鏈接,則應該很容易在運行時使用dlsym來定位函數。至於全局變量,你不需要做任何事情。

+0

只是讓全局變量暴露在重命名的「main」之上?爲什麼我不需要手動將它們包含在所有其他源文件中? – cmo

+0

第二個想法 - 甚至有必要重命名子進程的main函數? – cmo

+0

@CycoMatto當然,從來沒有見過一個共享庫,其中有'main'函數,但是如果它在應用程序啓動時沒有被鏈接器加載(衝突符號),那麼我想它應該可以工作。在應用程序啓動時阻止加載lib的好方法,如果你需要的話;)如果你花費精力並使主應用程序中的'main'未被導出,那麼它甚至可以用於啓動庫。 –