Dll 从静态链接库中导出函数的符号
Dll export symbol of function from static linked library
我在 Dll 中包装了一个静态库以隐藏大量实现内容,因为只需要 4-5 个函数并避免提供所有第三方库和许多头文件。我似乎在将函数从静态库导出到 dll 时遇到问题。
静态库的设置 类 / 类似于下面的结构
struct FooSettings
{
bool Read(const std::string& file); // implemented in .cpp
bool Write(const std::string& file); // implemented in .cpp
// rest members, just plain types
};
在Dll端
#include "FooSettings.h"
#if defined(WIN32) || defined(_WIN32)
#if defined(LIB_EXPORT)
// DLL Build, exporting symbols
#define LIB_API __declspec(dllexport)
#elif LIB_IMPORT
// DLL use, importing symbols
#define LIB_API __declspec(dllimport)
#endif
#endif
#ifndef LIB_API
#define LIB_API
#endif
class LIB_API LibSDK
{
public:
LibSDK();
~LibSDK();
FooSettings get() const noexcept;
void set(const FooSettings& settings) const noexcept;
void dummy()
{
foo.Read("");
}
private:
// etc...
};
我可以在 "client" 端呼叫 dummy()
没有任何问题
但下面的代码导致未解析的符号
FooSettings foo;
foo.Read("");
我原以为 FooSettings:Read 至少会导出,因为它是虚拟函数的一部分。我错过了什么吗?我的偏好是在没有虚拟功能的情况下导出它,但我似乎无法使其以任何方式工作。
回到这一切,答案实际上是静态库构建中的#define LIB_EXPORT,这出乎我的意料。
我不认为静态 .lib 文件需要这样的东西,因为它们只是一堆目标文件,因此不需要标记为导出。显然,如果您想将函数从静态库导出到包装器 dll,则需要它。
我在 Dll 中包装了一个静态库以隐藏大量实现内容,因为只需要 4-5 个函数并避免提供所有第三方库和许多头文件。我似乎在将函数从静态库导出到 dll 时遇到问题。 静态库的设置 类 / 类似于下面的结构
struct FooSettings
{
bool Read(const std::string& file); // implemented in .cpp
bool Write(const std::string& file); // implemented in .cpp
// rest members, just plain types
};
在Dll端
#include "FooSettings.h"
#if defined(WIN32) || defined(_WIN32)
#if defined(LIB_EXPORT)
// DLL Build, exporting symbols
#define LIB_API __declspec(dllexport)
#elif LIB_IMPORT
// DLL use, importing symbols
#define LIB_API __declspec(dllimport)
#endif
#endif
#ifndef LIB_API
#define LIB_API
#endif
class LIB_API LibSDK
{
public:
LibSDK();
~LibSDK();
FooSettings get() const noexcept;
void set(const FooSettings& settings) const noexcept;
void dummy()
{
foo.Read("");
}
private:
// etc...
};
我可以在 "client" 端呼叫 dummy()
没有任何问题
但下面的代码导致未解析的符号
FooSettings foo;
foo.Read("");
我原以为 FooSettings:Read 至少会导出,因为它是虚拟函数的一部分。我错过了什么吗?我的偏好是在没有虚拟功能的情况下导出它,但我似乎无法使其以任何方式工作。
回到这一切,答案实际上是静态库构建中的#define LIB_EXPORT,这出乎我的意料。
我不认为静态 .lib 文件需要这样的东西,因为它们只是一堆目标文件,因此不需要标记为导出。显然,如果您想将函数从静态库导出到包装器 dll,则需要它。