dll静态编译的问题 ---- 转

dll静态编译的问题 ---- 转

当选择multi-threaded或者multi-threaded debug静态编译时,请注意,编译器会为该dll单独实现一个c++ 运行库环境。这时,exe文件或者其他dll文件也使用静态编译等的时候,编译器又会实现多个c++运行库环境。在这个时侯,(由于微软的stl实现基于引用计数,)多个运行库的存在,就可能导致引用计数的错误(因为各个运行库分别计数)。

直接导致的问题就是,如果dll导出函数输入或者输出数据类型中使用了stl类时,程序有可能因为引用计数的问题而过早析构该对象,而导致后续访问野指针,应用程序崩溃。

所以当你选择静态编译的时候,记住返回的函数或者输入的参数,都不要使用stl类对象,否则程序将不稳定。

C++代码
  1. // 以std::string为示例,如下风格的函数不可用   
  2. std::string getString(); // 返回一个std::string或者std::string&   
  3.   
  4. void getString( std::string&);  //输入参数是std::string&等   
  5.   
  6. void setString( const std::string&); //同样会导致不可预料的错误,虽然输入的值是const类型的!  

 其他stl类库也都一样,不能作为输入或者输出的数据类型。

 注:动态编译不会有这个问题,因为大家共享同一个C++运行库。

你可能感兴趣的:(dll静态编译的问题 ---- 转)