c++ - 如何声明库和应用程序之间共享的类

标签 c++ windows

我有一个在两个项目(一个桌面应用程序项目和一个库项目 (dll))之间共享的公共(public)实用程序类。我在 VS2013 下工作。

为了让这个类在编译为我的库的一部分时可供外部调用,我使用了这样的宏:

#include "global.h"

class MYCLASS_EXPORT UtilityClass {

public:
...

我的 global.h 文件包含以下内容:

#ifdef MYCLASS_LIBRARY
# define MYCLASS_EXPORT __declspec(dllexport)
#else
# define MYCLASS_EXPORT __declspec(dllimport)
#endif

因此,当我在我的库中使用该类时,我设置了预处理器宏 MYCLASS_LIBRARY,并且链接我的库的应用程序可以使用 UtilityClass。

相反,当我将该类用作我的 C++ 桌面应用程序项目(没有预处理器宏 MYCLASS_LIBRARY)的一部分时,由于 MYCLASS_EXPORT 声明,我从编译器收到“不一致的 dll 链接”错误。

那么,如何声明我的类以便可以在库项目和桌面应用程序项目中使用(因此无需导出该类)?

为了更清楚起见,我找到了以下可行的解决方案:

#ifdef MYCLASS_LIBRARY
 #include "global.h"
#endif

#ifdef MYCLASS_LIBRARY
    class MYCLASS_EXPORT UtilityClass {
#else
    class UtilityClass {
#endif

    public:
    ...

现在一切都可以正常编译和运行,但似乎不是一个好方法...

最佳答案

我可以想到以下选项:

在桌面应用程序中,定义一个宏,MYCLASS_STATIC 并更改要使用的 .h 文件:

#ifdef MYCLASS_STATIC
  # define MYCLASS_EXPORT 
#elif defined(MYCLASS_LIBRARY)
  # define MYCLASS_EXPORT __declspec(dllexport)
#else
  # define MYCLASS_EXPORT __declspec(dllimport)
#endif

关于c++ - 如何声明库和应用程序之间共享的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32910238/

相关文章:

c++ - 如果你给一个指针加1,它是真的加1,还是加4或32?

c++ - IP地址匹配过滤功能

c++ - WinDbg 说在图像列表中找不到 ".dll"

c++ - 问题 - TCHAR 作为 LPARAM 到属于另一个进程/线程的窗口

python - 如何在 Windows 64 位平台上的 python 2.5 中终止进程?

python - 如何修复错误 “The filename, directory name, or volume label syntax is incorrect”?

c++ - 如何将应用程序的图像(HBITMAP)传输到另一个应用程序?

c++ - 将无符号字符数组转换为 float 组

python - 命令提示符 : Set up for Python 2. 默认为 7

windows - 如何将当前cygwin目录转换成windows格式