我在DLL文件中有一个应用程序和几个插件。这些插件通过导出库使用应用程序中的符号。应用程序链接在几个静态库中,这是大多数符号的来源。只要应用程序使用符号,就可以很好地工作。如果不在那里使用该符号,则在编译DLL时会出现链接器错误。
如何强制导出仅在插件中使用的符号?
为了触发导出,我尝试了如下所示:
class MyClassExporter
{
MyClass mInstance;
public:
MyClassExporter() {}
};
static MyClassExporter TheMyClassExporter;在其中一个静态库中,应用程序被用来强制导出,但这并不起作用。
为了响应Greg (感谢您的回答)并澄清:我希望强制导出的类是MyClass (它具有__declspec(...)定义,这取决于我想要导出还是导入)。MyClassExport是我试图强制在应用程序中包含未使用的符号(就应用程序而言)的尝试。我想“触摸”这些符号,这样链接器就可以识别它们,并将它们包含到应用程序中,这样它就可以反过来将它们导出到我的插件中。将静态库链接到插件中不是一种选择,因为它们包含的单例可能是重复的(应用程序和DLL每个都有自己的静态变量副本)。
发布于 2009-01-18 19:21:25
/INCLUDE指令可用于强制MSVC链接器包含符号。或者,通常可以使用/OPT:NOREF来禁止移除未使用的符号。
一种常见的方法是创建一个未使用的函数,该函数引用为您的插件导出的所有对象。那么您只需要为该函数使用一条/INCLUDE指令。
发布于 2009-01-15 05:17:08
您可能希望查看__declspec(导出/导入)
#ifdef DLL_EXPORTING
#define WHDLL __declspec(dllexport)
#else
#define WHDLL __declspec(dllimport)
#endif当将静态模块链接到dll中时,它只会引入所使用的代码。我从来没有从静态库中导入过东西,只是简单地重新导出它。
也许在编译静态库时,您只需要在dll中将其标记为可导出。
但这让我想起了将std容器放入导出类中,并在msvc中使用一些技巧来导出专用容器的“实例”。模板代码类似于您的静态代码(在我看来)
例如,如果没有模板,您会得到警告,模板代码不会导出以支持该类--据我所知,这是特定于MSVC的
template class DLL_EXPORTING std::auto_ptr<wxCursor>;
class DLL_EXPORTING imageButton : public wxWindow
{
std::auto_ptr<wxCursor> m_Cursor;
};发布于 2009-01-18 19:51:32
我尝试解决这个问题的方法是:
使用函数void afunction( int ).
afunction符号导出多么?由于可以使用__declspec(dllexport)指令告诉链接器导出函数,因此dll只需声明一个要导出的符号即可。
lib有一个头文件"afunction.h“和一个附带的cpp文件,其中包含函数体:
// 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")
// dll/indirect.h
namespace static_lib {
__declspec( dllexport ) void afunction(int);
}可执行文件只包含间接包含的文件:
#include <dll/indirect.h>
int main() { static_lib::afunction(1); }猜猜发生了什么?它可以编译、链接甚至运行!
https://stackoverflow.com/questions/444356
复制相似问题