Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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++_Shared Libraries_Cross Platform - Fatal编程技术网

C++ 如何识别在哪个模块中编译函数/对象

C++ 如何识别在哪个模块中编译函数/对象,c++,shared-libraries,cross-platform,C++,Shared Libraries,Cross Platform,我目前有一个项目,不同的共享库链接在一起。 这些库的用户可以将自己的共享库添加到项目中。在所有这些库中,可以编写如下内容: int a; OBJECT(a) double b; OBJECT(b) OBJECT是一个宏,它收集有关链接的int、double或任何其他类型/类的信息,并通过所有其他共享库中的公共接口使其可用。它在所有库共享的标头中定义 我现在想做的是确定宏在哪个共享库中被调用 目前,我在所有共享库共享的头文件中使用类似的内容: Module& getModule();

我目前有一个项目,不同的共享库链接在一起。 这些库的用户可以将自己的共享库添加到项目中。在所有这些库中,可以编写如下内容:

int a;
OBJECT(a)

double b;
OBJECT(b)
OBJECT
是一个宏,它收集有关链接的
int
double
或任何其他类型/类的信息,并通过所有其他共享库中的公共接口使其可用。它在所有库共享的标头中定义

我现在想做的是确定宏在哪个共享库中被调用

目前,我在所有共享库共享的头文件中使用类似的内容:

Module& getModule();

#define MODULE(name) Module& getModule() { \
    static Module mod{ #name }; \
    return mod; \
}
这将引入一个声明和一个宏来提供定义。然后,在每个共享库中,我只在一个.cpp中调用宏,每次使用不同的名称来引入定义。这正好定义了一个
静态模块mod每个共享库,每个库都有自己的名称。
对象
宏在内部调用此函数,将自身“注册”到给定的
模块
。通过这种方式,我可以获得使用
对象创建的所有对象的列表,这些对象按其
模块
排序(按它们所在的共享库排序)

对于MSVC,这很好。由于我没有在前面添加
\u declspec(dllimport/dllexport)
,因此我强制链接器链接到同一共享库中给定的定义。但是,在Linux(gcc)下,这不起作用,所有的
OBJECT
宏都在单个共享库中使用该定义,这意味着我无法再识别在哪个库中调用了该宏

我知道,C++标准根本不讲共享库,但我所要寻找的是“尽可能符合标准”或至少是尽可能便携的方式。 我考虑过使用一个宏,它只将“库名”作为字符串返回。但这意味着,如果包含其他库的头,则需要确保它们既不包含宏的定义,也不包含包含/定义的顺序,这两者在实践中都很难确定


有没有其他(智能)方法来解决此问题?

一个简单的解决方案,即使在Linux上也可以使用,就是将此
模块
静态函数标识符放在您链接的每个库中,但将其隐藏,以便默认情况下不会导出:

#ifdef _WIN32
    #define DLL_LOCAL
#elif __linux__
    #define DLL_LOCAL  __attribute__ ((visibility ("hidden")))
#endif

#define MODULE(name) DLL_LOCAL Module& getModule() { \
    static Module mod{ #name }; \
    return mod; \
}

两小时前也提出了同样的问题。出于好奇,你是测试工程师吗?不是,我正在为我们的物理研究小组开发一些实验室软件。你能把另一个问题和我联系起来吗?如果是相同的,我们可以删除这个。如果没有,我也许可以补充一些关于差异的东西。有点相似。嗯,不是真的。您链接的问题询问如何在通过dlopen加载库后获取库的名称/路径。我要寻找的是一种在编译期间获取名称、任何用户定义字符串或任何其他对此共享库唯一的方法。