我有一个C ++共享库。该库包含要导出的文件。我使用Qt,这很容易,但我不能再使用了它。所以我需要一个纯C ++变体,它涵盖Linux和Windows。所以我提出了以下宏定义。
纯C ++
#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
// Microsoft
#define MY_SHARED_EXPORT __declspec(dllexport)
#elif defined(__linux__) || defined(UNIX) || defined(__unix__) || defined(LINUX)
// GCC
#define MY_SHARED_EXPORT __attribute__((visibility("default")))
#else
// do nothing and hope for the best?
#define MY_SHARED_EXPORT
#pragma WARNING: Unknown dynamic link import/export semantics.
#endif
Qt C ++
#if defined(MY_LIBRARY)
# define MY_SHARED_EXPORT Q_DECL_EXPORT
#else
# define MY_SHARED_EXPORT Q_DECL_IMPORT
#endif
目前我正在使用Qt C ++变体。 我的问题是,如上所述,用纯C ++变体替换Qt变体是否安全。它们是等价的吗?
提前感谢任何帮助。
答案 0 :(得分:1)
定义自己的导入/导出宏是安全的。但是你发布的那个并不等同于Qt,因为你没有处理导入。它应该是:
#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
// Microsoft
#if defined(MY_LIBRARY)
#define MY_SHARED_EXPORT __declspec(dllexport)
#else
#define MY_SHARED_IMPORT __declspec(dllimport)
#endif
#elif defined(__linux__) || defined(UNIX) || defined(__unix__) || defined(LINUX)
// GCC
#if defined(MY_LIBRARY)
#define MY_SHARED_EXPORT __attribute__((visibility("default")))
#else
#define MY_SHARED_IMPORT
#endif
#else
// do nothing and hope for the best?
#define MY_SHARED_EXPORT
#pragma WARNING: Unknown dynamic link import/export semantics.
#endif
我不是100%肯定__attribute__((visibility("default")))
适用于Linux。在我看来,这是针对iOS的。
正如Rafael评论的那样,最简单的可能就是简单地转到Qt源(qglobal.h)并将Q_DECL_EXPORT
/ Q_DECL_IMPORT
从此处复制/粘贴到您自己的头文件中,然后将其包括在内你的环境。