关于什么:
// GlobalString.h
#include <string>
#include <vector>
#ifdef _MSC_VER
#ifdef GLOBAL_STRING_SRC
#define GLOBAL_STRING_DECLSPEC __declspec(dllexport)
#else
#define GLOBAL_STRING_DECLSPEC __declspec(dllimport)
#endif //GLOBAL_STRING_DECLSPEC
#endif // GLOBAL_STRING_SRC
inline EXPORT_SYMBOL std::vector<std::string>& GetGlobalStrings() noexcept
{
static std::vector<std::string> retval;
return retval;
}
然后编写一个 ODR 使用您的定义的 .cpp GetGlobalStrings
。在 Windows 上,声明函数dllexport
是隐式 ODR 使用。编译包含GlobalString.h
并将其链接到 dll 的 cpp 应该可以工作。
// GlobalSring.cpp
#define GLOBAL_STRING_SRC
#include <GlobalString.h>
如果使用 ODR ,该inline
关键字保证GetGlobalStrings
链接器看到的来自不同编译单元的多个定义将合并为一个。GetGlobalStrings
请放心,C++ 保证内联函数中的静态变量也会被合并。请注意,除非声明了定义,否则dllimport
on 函数定义是非法的inline
。我对 MacOS 动态库不太熟悉,但它应该与带有 -fvisibility=default 标志的 clang 类似地工作。
使用 C++17 也可以使用内联变量而不是函数:
inline EXPORT_SYMBOL std::vector<std::string> GlobalString;