C++ 创建一个库?

C++ 创建一个库?,c++,windows,visual-c++,C++,Windows,Visual C++,我正在使用MSVC,但我计划使我的库跨平台。 现在,我有类和函数的h和cpp文件。在MSVC中创建一个库是否简单,将所有的文件添加到一个标记为静态或动态库的VisualC++项目中?或者我必须使我的类和函数外部化等等 谢谢对于DLL,您需要根据是构建DLL还是导入DLL来指定\uuu declspec(dllimport)或\uu declspec(dllexport)。考虑这个例子: // MyHeader.h, part of FooDLL #ifdef BUILDING_DLL #def

我正在使用MSVC,但我计划使我的库跨平台。 现在,我有类和函数的h和cpp文件。在MSVC中创建一个库是否简单,将所有的文件添加到一个标记为静态或动态库的VisualC++项目中?或者我必须使我的类和函数外部化等等


谢谢

对于DLL,您需要根据是构建DLL还是导入DLL来指定
\uuu declspec(dllimport)
\uu declspec(dllexport)
。考虑这个例子:

// MyHeader.h, part of FooDLL

#ifdef BUILDING_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

void DLL_EXPORT MyFunction();

class DLL_EXPORT MyClass { 
public: 
 MyClass(); 
};
注意:我重新排序了“void”和“DLL\u EXPORT”(以前是DLL\u函数),因为我以前把它搞混了

当包含DLL项目中的头时,函数将被标记为导出。当从另一个项目(没有BUILDING_DLL预处理器定义)包含它时,它将被解释为DLL导入。这可以以完全相同的方式应用于类。在Linux(可能还有其他类似的平台)上,您可以安全地将DLL_函数定义为“无”,因为它不是必需的


Edit:如果你想让你的函数可以从C中调用,那么你显然也需要加入一个旧的
extern“C”
,以防止名称混乱



编辑2:实际上,MSVC在构建DLL时也会生成一个静态库。任何使用DLL的项目都必须链接到库(库实际上并不包含可执行代码;它仍然像人们所期望的那样动态链接),以满足链接器的要求。

静态或动态取决于不加载它的方式。 如果它是静态的,则在构建应用程序时需要链接它

对于函数,这同样取决于您不想做什么。 如果它是一个插件,你需要声明一些入口点->外部 如果它是一个静态库,您只需要在使用它的应用程序的构建中包含头


这不是一个如此简单的问题,它实际上取决于你想做什么。

当然,除了下面描述的以外,还有一些事情我现在还没有记起。您可能会考虑查看大型跨平台的开源项目,比如说已经考虑过这些问题的WXWIDGET。

静止的 静态库(.A |.lib)类似于对对象(.o)文件进行压缩,以便您可以将它们作为一个单元进行管理,当您编译其他程序以使用静态库时,它所需的所有对象文件都将在其中编译

在大多数情况下,您不需要做更多的事情,您也可以直接包含对象文件

应该考虑模块的大小以及您可能需要使用这些功能的次数-如果您希望在一个应用程序中使用多个模块的库,请避免使用静态库

动态 您需要为MSVC指定比标准类更多的类

  • 使用
    \u declspec(dllexport)
  • 库的哪些用户可以使用
    \uu declspec(dllimport)
  • 你会有不止一个图书馆吗
示例头存根,使其足够唯一,这样您就不会与其他库发生冲突

// MartinsHeader.h
#ifdef BUILDING_DLL_A
#define DLL_A_EXPIMP __declspec(dllexport)
#else
#define DLL_A_EXPIMP __declspec(dllimport)
#endif

void DLL_A_EXPIMP MyFunction();
class DLL_A_EXPIMP MyClass{};
如果没有显式实例化,则公共接口中的模板类可能会发出警告,以便编译所有模板代码

您可能想考虑piml以最小化对类的实现的外部可见的更改。(减少库用户重新编译新库的需要)

内存问题 运行时对于谁(取消)分配什么变得很重要

A) 在这一点上,您可以坚持使用本机内存模型

  • 对于单线程/多线程调试和发布模式,有些库将有一系列不同的编译。它需要匹配调用模块的运行时(EXE/DLL)
  • 在接口中使用类通常会增加一个要求,即在库和应用程序中使用相同版本的类-通常意味着在visual C版本上进行多次编译

B) 您可以通过引入纯工厂分配和销毁方法来强制内存(de)分配,因此所有操作都由库执行。(我不太喜欢这个,因为它使代码变得更难,但它可以使运行时问题更容易)

您要生成静态库还是动态库?你只会导出C风格的函数/结构,还是C++类?C++类,我希望它是静态的还是动态的(2个项目),你能用一个类来演示一个例子吗?你也说这是Windows特定的,在其他的平台上我还好吗?如果是静态的,则忽略上面的内容?因此对于类,只有类本身需要它,而不是它的嵌套函数?是的,据我所知,这就是它的全部内容。如果他希望库是跨平台的,他应该使DLL_导出在非Windows平台上解析为空。@asveikau:我已经注意到了。请参阅编辑之前的最后一段。我只想创建一个库,如GLUT、wxWidgets等,它可以是动态的,也可以是静态的