c++ - 使用不同的 C++ 环境创建 DLL

标签 c++ dll c++11 linker c++03

我有一个正在构建的库,目标是成为链接到主解决方案的 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 并不是为了更新 - 强类型枚举和跨平台线程代码将为库带来巨大的好处。

最佳答案

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

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

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

关于c++ - 使用不同的 C++ 环境创建 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13387038/

相关文章:

C++互斥锁定线程优先级

c++ - 我需要手动销毁抛出的物体吗?

c# - MSTest.exe 给出程序集或模块未找到警告

windows - 无法对打开了用户映射部分的文件执行请求的操作

c++ - 自定义 std::shared_ptr 删除器

c++ - 输入流上的基于范围的循环

c++ - 使用 C++0x std::thread 在 new-ed 对象中调用成员函数

c++ - 将在函数中传递引用作为参数以更改参数变量的值。

c++ - 将地址转换为函数 : using "void * void "

c++ - 线程退出时,dll 中的 mfc 无模式对话框被破坏