1

我有一个正在构建的库,它的目标是链接到主解决方案的 DLL。

这个新的 DLL 相当复杂,我想利用 C++11 的特性,而链接它的程序肯定不会。事实上,主程序目前是使用 VS2008 和 VS2010“干净”构建的(我认为 GCC 4.3 for linux?)。

我的建议:

使用 VS2012 作为 IDE,使用 Intel C++ Compiler 2013 编译为 .dll/.so - 对于 linux - 据我了解,这基本上是机器形式(如 .exe)。

虽然我熟悉使用 C++ 解决问题,但我对编译/链接等基础知识并不流利。因此,我想问问社区是否

  1. 这个有可能
  2. 如果可能的话,它有多容易(就像我描述的那样简单?)/在此过程中我会遇到哪些陷阱或问题(是否值得)?

我预计的关注领域:

  • 运行时库——我希望这会成为阻碍这项工作的因素。我对它们/它们如何工作一无所知,除了它们可能是一个问题。
  • 标准库实现差异 - 是否归结为 DLL 形式是否重要?
  • 线程冲突 - dll 线程和主程序线程从不修改相同的数据,实际上主程序的线程之一将调用 DLL 函数。

奖励:虽然以上是我希望采用的路线,但我理想情况下希望将此代码打开以进行智能感知、一般查看等(本质上是让它成为主要解决方案中的一个项目)。有没有办法指定不同的运行时库/编译器?这可以做到吗?

编辑:这个奖励部分的主要原因是消除如果主程序和这个库是分开构建的,就会出现必要的“版本控制”冲突。

注意:我不是为了更新而使用 C++11 - 强类型枚举和跨平台线程代码将为库带来巨大的好处。

4

2 回答 2

2

问题不在于“应用程序可以使用由不同编译器构建的库吗?” (答案是肯定的。)但是“在使用另一个编译器和 C++ 标准库构建的库的公共接口中可以使用哪些 C++ 功能?”

在 Windows 上,答案是“几乎没有”。接口(只包含虚函数的类)就是关于它的。没有具有数据成员的类。没有例外。没有运行时对象(如 iostream 实例或字符串)。没有模板。

在 Linux 上,答案是“更多但仍然不多”。只要满足ODR,课程就可以了。例外会起作用。模板也是如此,只要两边的定义完全一样。但是标准库类型的定义在 C++03 和 C++11 之间确实发生了变化,因此您将无法在应用程序和库之间传递std::string对象std::vector<int>(双方都可以使用这些功能,但同一个对象可以不要跨越)。

于 2012-11-14T21:12:43.893 回答
1

恐怕这在 C++ 中是不可能的。特别是名称修饰可能会有所不同。所有链接在一起的 C++ 文件都需要使用相同的编译器进行编译。

在 C++ 中,extern "C"东西是标准的(命名、调用约定),因此可以从 C++ 调用 C 库,以及使用extern "C"块声明的 C++ 函数。这不包括类、模板、重载,混合由不同编译器编译的它们是不可行的。

这是一个遗憾。

于 2012-11-14T21:02:41.330 回答