【问题标题】:Should I be exporting members of a static lib consumed by a dll我应该导出 dll 使用的静态库的成员吗
【发布时间】:2021-11-05 00:39:51
【问题描述】:

我正在使用 MSVC。而且我一直在阅读,我知道这种类型的事情是一个常见的问题,只是想弄清楚!

我有一个静态库的层次结构,即一个接口库和一个实现库。我正在尝试将它们捆绑到一个 dll 中,但在弄清楚何时应该在成员上使用 __declspec(dllexport) 时遇到问题。

例如,我有一个接口类IInstance,它位于Interface.lib

class IInstance : public IModule
    {
    public:
        IInstance() : IModule() {}
        virtual ~IInstance() {}
        static API_TYPE const ModuleCategory category;       
    };

另一个静态库 (System.lib) 提供了一个实现:

 class DefaultInstance : public IInstance
    {
    public:
        DefaultInstance();
        ~DefaultInstance();

    private:

我想将这两个 .lib 链接到一个 .dll 中。 另一个不同的静态库将包含接口类的头文件。

我遇到的问题的一个例子是IInstance 中的ModuleCategory。你可以看到我有 API_TYPE 准备好成为 __declspec(dllexport)__declspec(dllimport),这取决于预处理器定义,例如

#ifdef MY_PROJECT_DLL 
#pragma message("Building with DLL exports" )
#define API_TYPE __declspec(dllexport)
#else
#pragma message("Building with DLL imports" )
#define API_TYPE __declspec(dllimport)
#endif

根据我的阅读,当我构建 DLL 时,我应该使用在 DLL 项目中设置的预处理器定义(例如 MY_PROJECT_DLL),但是我没有看到引用的 . lib 项目,即我在构建 DLL 时看到这样的输出

1>------ Build started: Project: System, Configuration: Debug x64 ------
1>DefaultInstance.cpp
1>Building with DLL imports
1>Building with DLL imports
...
2>------ Build started: Project: MyNativeDLL, Configuration: Debug x64 ------
2>SomeOtherThing.cpp
2>Building with DLL exports
2>Building with DLL exports
2>Building with DLL exports

应该是这样吗?我期待看到静态库获取 dll 项目中定义的 MY_PROJECT_DLL?

编辑: 我已经开始使用定义的 MY_PROJECT_DLL 构建静态库。包含来自这些库的标头的其他库则将API_TYPE 视为__declspec(dllimport)

一一解决未解决的外部问题,但这看起来是一个可能的解决方案

【问题讨论】:

    标签: c++ visual-c++ dll linker


    【解决方案1】:

    我发现对我来说解决方案有两个。

    首先,静态库需要在项目中设置预处理器定义,以便它们使用__decl(dllexport)

    其次 - 这是我在其他任何地方都找不到的明显之处 - 动态库对静态库的默认链接意味着即使符号被导出到 .lib 文件中,它们也不包括在内在最后的.dll 中,除非它们被实际使用。

    对我来说,最好的解决方案是链接在构建 .lib 文件时创建的 .obj 文件。 这保证(不确定保证有多可靠!).obj 中的符号使其进入.dll。 还有其他方法可以实现这一点,例如使用一个虚拟文件来使用所需的每个功能。

    在 Visual Studio 中,引用项(我使用项目引用来链接静态库)上有一个名为“使用库依赖输入”的属性。 将此设置为true,则链接静态库的.obj文件而不是.lib,并且所有符号都包含在生成的.dll中。

    非常好的帖子提到了链接问题here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多