我在Windows上使用VC9。
我有一个库(让我们称之为libfoo
),它由以下文件组成(为了清楚起见,省略了“包括警卫”和“#include”指令):
// foo.hpp
class Foo
{
public:
static const std::string SOME_CONST;
};
和
// foo.cpp
#include "foo.hpp"
const std::string Foo::SOME_CONST = "hello";
使用Foo::SOME_CONST
文件导出 .def
。
库编译正常:生成libfoo.lib
文件和libfoo.dll
文件。
我在示例程序中使用了这个库,例如:
// main.cpp
#include <foo.hpp>
int main()
{
std::cout << Foo::SOME_CONST << std::endl; // std::bad_alloc here
return EXIT_SUCCESS;
}
每当我尝试使用std::bad_alloc
时,都会抛出Foo::SOME_CONST
。
仅当我将动态链接到libfoo
时才会发生这种情况。链接静态会产生完美的工作程序。
这可能会发生什么?以这种方式导出std::string
常量是否合法?
答案 0 :(得分:2)
检查dll是否实际执行动态初始化,因为它可能不会,标准对动态库没有要求。在静态函数中包装全局变量可以是解决方案。
答案 1 :(得分:1)
使用__declspec(dllexport)和__declspec(dllimport)。不要担心.def文件和所有垃圾 - 让编译器完成工作。
答案 2 :(得分:1)
库和主应用程序是否链接到标准库和/或CRT和/或MFC的相同版本,具有完全相同的设置?我在使用不同版本的CRT时已经看到了分配问题,并且还讨论了由库及其包括应用程序之间的不同迭代器调试设置引起的错误。