Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造函数的链接时间自动注册_C++_C_Shared Libraries_Static Libraries_Dlopen - Fatal编程技术网

C++ 构造函数的链接时间自动注册

C++ 构造函数的链接时间自动注册,c++,c,shared-libraries,static-libraries,dlopen,C++,C,Shared Libraries,Static Libraries,Dlopen,我正在尝试构建一个服务/守护进程,以促进“applet”在其进程信封中运行。该服务通过这些小程序调用的库公开功能。最重要的是,这里的要求是这些小程序都需要在与服务本身相同的进程边界内运行。小程序还需要在启动时根据服务注册自身 我希望设计的服务,使它可以独立于这些小程序,以及没有任何代码,其中特别是知道这些小程序 这里的一个选项是将小程序构建为共享库。因此,让它们都放在目标文件系统中的一个特定文件夹中,该文件夹在启动时由服务搜索,加载所有。因此,通过dl_open动态地位于该文件夹中。通过在小程序

我正在尝试构建一个服务/守护进程,以促进“applet”在其进程信封中运行。该服务通过这些小程序调用的库公开功能。最重要的是,这里的要求是这些小程序都需要在与服务本身相同的进程边界内运行。小程序还需要在启动时根据服务注册自身

我希望设计的服务,使它可以独立于这些小程序,以及没有任何代码,其中特别是知道这些小程序

这里的一个选项是将小程序构建为共享库。因此,让它们都放在目标文件系统中的一个特定文件夹中,该文件夹在启动时由服务搜索,加载所有。因此,通过dl_open动态地位于该文件夹中。通过在小程序自身中标记init函数_属性_构造函数,小程序可以在初始化时向服务注册自身

是否有此的静态/链接时间版本?我已经涉猎了这个建议,但无法阻止编译器优化每个小程序导出的全局函数注册表对象。使用-Wl,-whole archive也不起作用,因为在链接两个或多个这样的小程序库时,它会抱怨服务/守护程序库提供了多个函数定义

是否有此的静态/链接时间版本

有,但这样的解决方案无法满足您的需求,即可以独立于这些小程序构建服务。通过静态链接,服务和所有小程序都链接在一起,因此根据定义不能单独构建

也就是说,-Wl,-整个归档是解决您问题的正确方法

也不起作用,因为它抱怨服务/守护程序库提供的函数的多个定义

不要将服务/守护程序库放入每个小程序库中,这样做没有任何意义。把它放进自己的图书馆。这应该起作用:

gcc main.o -Wl,--whole-archive -lapplet1 -lapplet2 ... -lservice -Wl,--no-whole-archive

你能用_属性_防止对象被优化吗?我试过用,但没用。我相信它只适用于函数,-undefined方法确实有效,但它不包括两个不同的小程序在全局范围内具有相同符号名的情况。当您尝试呈现未定义的符号时,链接器链接的第一个小程序将解析为该未定义的符号,让另一个小程序不起作用。@Bodo:attribute used没有传播到链接器,因此在这种情况下没有帮助。您完全正确,静态版本必须放弃独立构建它们的理想。我愿意接受一个折衷方案,即拥有一个“暂存”文件夹,所有applet静态库都将暂存到该文件夹中,然后通过构建脚本对该文件夹进行迭代,以创建带有适当“-lapplet”参数的最终守护程序二进制文件。然而,即使使用建议的方法,我如何解决这些小程序可能具有的其他库依赖关系?