相关疑难解决方法(0)

创建C ++ API库

我试图了解为非开放源代码项目提供相当大的C ++ API的正确方法或正确方法。我不想提供“仅标头”库,因为代码库很大,并且打算封闭源代码。目标如下:

  • 提供本机C ++ API,用户可以实例化C ++类,在C ++中传递数据,而无需C-only包装器
  • 允许方法作为参数并返回C ++对象,尤其是STL类型(std :: string,std :: vector等)
  • 没有自定义分配器
  • 大多数行业标准/规范方法可以做到这一点,如果存在这样的标准
  • 无需重新创建COM或使用MS COM
  • 假设所有C ++编译器至少符合“ C ++ 11”标准

我的目标是Windows以及其他平台(Linux)。

我的理解是由于DLL边界问题,无法创建DLL或共享库。为了解决DLL边界问题,必须使用动态链接的运行时(以及Windows上的正确版本,多线程/调试/等)编译DLL和调用代码,然后所有调试器设置都必须与调试符号相匹配(迭代器调试设置等)。我有一个问题是,例如,如果在Windows上使用Visual Studio中的默认“调试”和“发布”设置来确保编译器设置在/ MD方面匹配,那么我们是否真的可以“安全”使用DLL是否以这种方式(即来回传递STL对象,以及在发生不匹配时肯定会造成危险/失败的各种事物)?做共享对象,*。

使用静态库是否可以解决此问题?静态库和链接到该库的调用代码之间需要多少匹配编译器设置?与DLL(在Windows上)几乎一样的问题吗?

我尝试过在线查找图书馆的示例,但在此方面找不到太多指导。许多资源都在讨论开放源代码解决方案,该解决方案似乎是将标头和实现文件复制到代码库中(仅用于非标头),不适用于封闭源代码。

什么是正确的方法?看来这应该是一个普遍的问题;尽管我想知道大多数商业供应商是否仅使用C接口。

如果可以解决问题,我可以使用静态库。我还可以接受这样的想法:拥有一组具有Y设置变体的X编译器(其中X和Y是要支持的预定选项列表),并拥有一个生成X * Y共享二进制库的构建系统,如果那样的话是“安全的”。

答案是否真的只是与工厂一起执行C接口或创建Pure Abstract接口?(如果是这样,是否有规范的书籍或指南用于编写此文档,但未实现Microsoft COM?)。

我知道Stefanus DuToit的沙漏图案:https//www.youtube.com/watch? v = PVYdHDm0q6Y

我担心这是很多代码重复。

我并不是在抱怨事物的状态,我只是想了解“正确”的方式,希望对其他处于类似位置的人来说,这是一个很好的问题。

我已经查看了这些Stackoverflow参考:

何时使用动态库与静态库

如何安全地将对象(尤其是STL对象)与DLL传递?

分发Windows C ++库:如何决定创建静态库还是动态库?

静态库API问题(std :: string与char *)

简单的方法来保证C ++库和C链接的二进制兼容性?

也有评论:

https://www.acodersjourney.com/cplusplus-static-vs-dynamic-libraries/

https://blogs.msmvps.com/gdicanio/2016/07/11/the-perils-of-c-interface-dlls/

c++ api-design dynamic-linking static-linking

6
推荐指数
1
解决办法
491
查看次数

Visual C++ 发行版本 - 当通过 DLL 传递时,字符串是否会因为使用不同的运行时版本编译而损坏?

在发布模式下构建后,我看到了在调试模式下未发生的异常。调试发布版本时,字符串引用似乎没有从 EXE(我们的应用程序)正确传递到接收字符串引用的 DLL。

我们的 EXE 代码如下所示:

string contents = "handle_message(): received=" + msg->encode();
LOG4CXX_DEBUG(logger, contents);
Run Code Online (Sandbox Code Playgroud)

LOG4CXX_DEBUGlog4cxx.dll,其代码如下所示:

CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string<char>& msg) {
   if (stream == 0) {
      buf.append(msg);
   } else {
      *stream << msg;
   }
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

查看调试器中的调用堆栈,当我向下导航到包含源代码的框架时,我可以看到这contents是一个带有size=583, capacity=838.

log4cxx.dll在(堆栈中上面的下一帧) 内部的帧中,字符串引用显示size=838, capacity=363113231(并且值都是垃圾)。

我们的应用程序和 log4cxx.dll 都是在同一台计算机上编译的,使用相同的运行时设置 (/MD),但 Visual Studio 版本不同。log4cxx dll 是使用 Visual Studio 2008 编译的,我们的应用程序是使用 Visual Studio 2010 编译的。在 2 个对象上运行 dumpbin 显示:

我们的应用程序(EXE)

MSVCP100.dll
MSVCR100.dll
Run Code Online (Sandbox Code Playgroud)

log4cxx.dll (DLL)

MSVCP90.dll …
Run Code Online (Sandbox Code Playgroud)

dll corruption visual-c++

4
推荐指数
1
解决办法
2133
查看次数