C++ 从独立程序创建共享库-如何使用;int main();?

C++ 从独立程序创建共享库-如何使用;int main();?,c++,shared-libraries,C++,Shared Libraries,在我的程序中,我需要调用一个子进程*sub_prog*。我通过系统调用来实现这一点,例如system(“sub_prog arg1 arg2…”)。足够简单;一切正常 不幸的是,我正在使用的超级计算机不支持子进程的生成(由于体系结构的原因,您不能将fork()、popen()等用于MPI。这只是一个事实)。因此,解决方案是将*sub_prog*制作成一个(共享)库,并将其作为库函数调用,而不是作为子进程 我创建了共享库*libsub_prog.so*很好。问题是-我想要调用的函数是*sub_pr

在我的程序中,我需要调用一个子进程*sub_prog*。我通过系统调用来实现这一点,例如
system(“sub_prog arg1 arg2…”)。足够简单;一切正常

不幸的是,我正在使用的超级计算机不支持子进程的生成(由于体系结构的原因,您不能将fork()、popen()等用于MPI。这只是一个事实)。因此,解决方案是将*sub_prog*制作成一个(共享)库,并将其作为库函数调用,而不是作为子进程

我创建了共享库*libsub_prog.so*很好。问题是-我想要调用的函数是*sub_prog*本身,也就是说,我想要调用
sub_prog
main(argc,argv)

关于共享库的问题通常集中在从共享库调用成员函数上。但是如果我想调用main函数本身呢

(我曾考虑将*sub_prog*的
int main
重命名为另一个名称,实质上将其
main
转换为另一个成员函数。但在
int main
之前定义了几个全局变量)。我是否必须将这些文件放在globals.h的头文件中,然后在每个源文件中手动插入“#include globals.h”


多亏了前面的所有内容。

我只需给它一个不同的名称,将其转换为一个普通函数,并使用这个新名称从主可执行文件调用它。如果您将函数声明为具有
extern“C”
链接,那么在运行时使用
dlsym
可以很容易地找到函数。对于全局变量,你不需要做任何事情。< /P>使用<代码> dLySm < /C> >有什么不对?这超出了STD C++的范围,因此为环境添加相应的标记。您似乎对全局变量有一些误解,您的担心似乎没有任何意义。另外,您确定需要一个共享库吗?有充分的理由,但您没有提供任何理由。重命名sub_prog的主函数,然后将两个程序静态链接在一起就足够了。我希望创建一个共享库,因为最终我将拥有>=2个单独的程序来调用此子进程,因此,创建共享库更合适/更成熟。只需将全局变量暴露在重命名的“main”上方即可?为什么我不需要手动将它们包含在所有其他源文件中?仔细想想——甚至有必要重命名子进程的
main
函数?@CycoMatto当然从未见过包含“main”函数的共享库,但如果它在应用程序启动时未由链接器加载(符号冲突),那我想应该行了。在应用程序启动时阻止加载库的好方法,如果您需要的话;)如果您努力使主应用程序中的“main”不导出,那么它甚至可以用于启动libs。