2011-12-12 49 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'未被导出,那么它甚至可以用于启动库。 –