Visual c++ 如何使库独立于编译器版本?

Visual c++ 如何使库独立于编译器版本?,visual-c++,linker,version,Visual C++,Linker,Version,我现在使用msvc编译器 我想制作独立于mvsvc版本的链接库(lib、dll) 是否可以创建独立的库?静态库-否。DLL-是,当公共接口设计适当时 通常有两种方法可以通过DLL实现这一点: DLL导出许多形成C风格API的函数,类似于Windows API。这些函数在签名中只使用原始类型,以及它们的数组和结构(没有C++类)。对象由句柄(参见HWND或HDC)表示,带有一组用于操纵这些句柄的函数 DLL是一个COM服务器(或至少导出一个类似COM的接口)。基本上是一个工厂函数(在COM中,Dl

我现在使用msvc编译器

我想制作独立于mvsvc版本的链接库(lib、dll)


是否可以创建独立的库?

静态库-否。DLL-是,当公共接口设计适当时

通常有两种方法可以通过DLL实现这一点:

  • DLL导出许多形成C风格API的函数,类似于Windows API。这些函数在签名中只使用原始类型,以及它们的数组和结构(没有C++类)。对象由句柄(参见
    HWND
    HDC
    )表示,带有一组用于操纵这些句柄的函数

  • DLL是一个COM服务器(或至少导出一个类似COM的接口)。基本上是一个工厂函数(在COM中,
    DllGetClassObject
    ),它生成一个指向抽象类的指针,该抽象类没有数据成员,所有成员函数都是纯虚拟的(通常称为接口)。所有的访问都是通过调用这些接口上的方法来实现的(这些接口反过来可能会生成其他接口指针)


  • 您应该注意的另一个注意事项是资源管理,特别是但不限于内存管理。您不能假设DLL中的内存
    malloc
    ed在客户端中可能是
    free
    d,反之亦然。您必须确保资源分配/解除分配不会跨越模块边界。可能是DLL从未分配客户端需要释放的内存;或者DLL导出一个特殊函数,客户端应该调用该函数来释放DLL分配的内存;或者DLL使用操作系统提供的工具(例如COM中的
    CoTaskMemAlloc
    /
    CoTaskMemFree

    自定义数据类型(即结构)的大小如何?结构的大小取决于填充值?所有能够构建Windows可执行文件的编译器必须至少就
    #include
    引入的结构布局达成一致。实际上,这意味着它们为大多数结构(如果不是所有结构的话)生成相同的布局。虽然编译器原则上可以自由地在任意位置引入任意填充,但实际使用这种自由的编译器将不适合Windows编程。