首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MSVC强制符号导出

使用MSVC强制符号导出
EN

Stack Overflow用户
提问于 2009-01-14 19:34:11
回答 5查看 11.6K关注 0票数 8

我在DLL文件中有一个应用程序和几个插件。这些插件通过导出库使用应用程序中的符号。应用程序链接在几个静态库中,这是大多数符号的来源。只要应用程序使用符号,就可以很好地工作。如果不在那里使用该符号,则在编译DLL时会出现链接器错误。

如何强制导出仅在插件中使用的符号?

为了触发导出,我尝试了如下所示:

代码语言:javascript
复制
    class MyClassExporter
    {
        MyClass mInstance;
    public:
        MyClassExporter() {}
    };
    static MyClassExporter TheMyClassExporter;

在其中一个静态库中,应用程序被用来强制导出,但这并不起作用。

为了响应Greg (感谢您的回答)并澄清:我希望强制导出的类是MyClass (它具有__declspec(...)定义,这取决于我想要导出还是导入)。MyClassExport是我试图强制在应用程序中包含未使用的符号(就应用程序而言)的尝试。我想“触摸”这些符号,这样链接器就可以识别它们,并将它们包含到应用程序中,这样它就可以反过来将它们导出到我的插件中。将静态库链接到插件中不是一种选择,因为它们包含的单例可能是重复的(应用程序和DLL每个都有自己的静态变量副本)。

EN

回答 5

Stack Overflow用户

发布于 2009-01-18 19:21:25

/INCLUDE指令可用于强制MSVC链接器包含符号。或者,通常可以使用/OPT:NOREF来禁止移除未使用的符号。

一种常见的方法是创建一个未使用的函数,该函数引用为您的插件导出的所有对象。那么您只需要为该函数使用一条/INCLUDE指令。

票数 4
EN

Stack Overflow用户

发布于 2009-01-15 05:17:08

您可能希望查看__declspec(导出/导入)

代码语言:javascript
复制
#ifdef DLL_EXPORTING
#define WHDLL __declspec(dllexport)
#else
#define WHDLL __declspec(dllimport)
#endif

当将静态模块链接到dll中时,它只会引入所使用的代码。我从来没有从静态库中导入过东西,只是简单地重新导出它。

也许在编译静态库时,您只需要在dll中将其标记为可导出。

但这让我想起了将std容器放入导出类中,并在msvc中使用一些技巧来导出专用容器的“实例”。模板代码类似于您的静态代码(在我看来)

例如,如果没有模板,您会得到警告,模板代码不会导出以支持该类--据我所知,这是特定于MSVC的

代码语言:javascript
复制
template class DLL_EXPORTING std::auto_ptr<wxCursor>;
class DLL_EXPORTING imageButton : public wxWindow
{
    std::auto_ptr<wxCursor> m_Cursor;
};
票数 3
EN

Stack Overflow用户

发布于 2009-01-18 19:51:32

我尝试解决这个问题的方法是:

使用函数void afunction( int ).

  • build a dll构建一个静态库,链接到静态库,使用afunction符号导出

多么?由于可以使用__declspec(dllexport)指令告诉链接器导出函数,因此dll只需声明一个要导出的符号即可。

lib有一个头文件"afunction.h“和一个附带的cpp文件,其中包含函数体:

代码语言:javascript
复制
// stat/afunction.h
namespace static_lib { void afunction(int); }


// stat/afunction.cpp
#include "afunction.h"
namespace static_lib { void afunction(int){ } }

dll有一个包含文件"indirect.h",其中包含要导出的函数的声明。dll具有对静态库的链接时间依赖性。(链接器选项:输入/附加依赖项:"static_library.lib")

代码语言:javascript
复制
// dll/indirect.h
namespace static_lib {
  __declspec( dllexport ) void afunction(int);
}

可执行文件只包含间接包含的文件:

代码语言:javascript
复制
#include <dll/indirect.h>
int main() { static_lib::afunction(1); }

猜猜发生了什么?它可以编译、链接甚至运行!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/444356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档