使用std :: string在DLL中创建一个类。 C4251警告

时间:2015-08-12 09:20:07

标签: c++ c++11 dll stl compiler-errors

我想在DLL中实现一个简单的类,如:

class MY_EXPORT_IMPORT MyClass
{
public:
    //std::string anyPublicStr; //see point 3
protected:
    std::string anyStr;
};

问题是Visual C ++编译器(在本例中为2013)会抛出以下警告:

  

C:... MyClass.hpp:X:警告:C4251:' MyClass :: postfix' :上课   '的std :: basic_string的,性病::分配器>'   需要有dll-interface才能被struct' MyClass'

的客户使用

我阅读了几个论坛,了解为什么会显示此警告以及如何解决此问题。但我现在还不清楚:

  1. 大多数论坛都谈到导出模板,这对模板有意义,但std :: string已经是特定类型。
  2. 另一个页面说"从DLL导出std :: string是一个非常糟糕的主意,原因有几个。"这是有道理的。
  3. 其他人表示将参数封装在非内联函数中的解决方案。好吧,在我们的例子中,std :: string已经受到保护,切换到private并不能解决警告。
  4. 我个人不明白为什么这个类不能只是静态地链接所需的STL库,并使它在不导出任何东西的情况下工作。或者如果STL是动态链接的,它也应该在dll中自动链接。

    为什么这是警告?怎么解决?

1 个答案:

答案 0 :(得分:2)

std :: string只是一个typedef:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="horizontal"
  android:weightSum="2" >

  <LinearLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:src="@drawable/arches_utah" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:src="@drawable/blue_sea_mountains" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:src="@drawable/china_jungle" />
  </LinearLayout>

  <LinearLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical" >
  </LinearLayout>

</LinearLayout>

关于在dll接口边界上使用STL,通常情况下,如果你避免使用它会更简单,我个人更喜欢如果可能的话。但编译器只是给你一个警告,并不意味着你会以问题结束。看看:DLLs and STLs and static data (oh my!)