我正在编写一个带有辅助函数的共享库/DLL。所以我声明命名空间在未来不会发生名称冲突。对于类,这很好用,但我有一些全局函数,我也想放在命名空间中,但这不起作用。尝试寻址命名空间时出现链接器错误。看起来好像无法从 DLL 中导出命名空间。
我用谷歌搜索并在这里找到了这个线程我应该把我的 DECLSPEC 放在哪里作为命名空间?我真的不明白答案。命名空间的重点是分隔名称并使它们唯一可识别,所以我想知道为什么它是一个公认的答案,即不需要导出命名空间。但是,也许我在这里遗漏了一些东西。我可以看到它自己的命名空间无法导出,但里面的函数应该仍然属于命名空间,这似乎是不可能的。但是,我在命名空间中拥有的类按预期工作,所以我有点困惑为什么这也不应该适用于其他符号。
我现在通过创建一个虚拟类包装器并将我的函数声明为静态来结束。它不是 100% 像命名空间,但对于我的目的来说足够相似。
在 DLL 中:
class EXPORT_DECL Base64
{
public:
static std::string encode(unsigned char const *bytes_to_encode, unsigned int in_len);
static std::string decode(std::string const &oBase64Encoded);
};
主要是我可以像在命名空间中一样处理它们。
Base64::encode(...);
不过,我想知道,如果我在这里遗漏了什么,并且可以使用命名空间而不是使用此解决方法。共享库是否也有这个限制,或者这只是来自 DLL 的东西?
更新
共享库 foo.h:
namespace mytest
{
int mytestfkt(int a);
EXPORT_DECL int decltest(int a);
}
共享库 foo.cpp。
int mytestfkt(int a)
{
return 0;
}
int decltest(int a)
{
return 0;
}
或这个:
namespace mytest
{
int mytestfkt(int a)
{
return 0;
}
EXPORT_DECL int decltest(int a)
{
return 0;
}
}
或这个:
int mytest::mytestfkt(int a)
{
return 0;
}
EXPORT_DECL int mytest::decltest(int a)
{
return 0;
}
主.cpp:
int x = mytest::mytestfkt(1);
x = mytest::decltest(1);
结果:
undefined reference to `mytest::mytestfkt(int)'
undefined reference to `mytest::decltest(int)'