大家问候,

我将MinGW,QT和CMake用于我的项目。

如图所示,我的项目有两个模块。

  • libRinzoCore.DLL-一个共享库,定义了一些抽象类和接口(interface)以及应用程序的某些核心功能。此模块用于实现动态插件(也是由应用程序自动加载的共享库)。
  • Rinzo.exe-主应用程序。它使用“libRinzoCore”类。

  • “libRinzoCore”主要使用QT对象开发并链接到QT库。

    “Rinzo.exe”还使用QT库对象,“libRinzoCore”中未使用某些对象。因此,我必须将此可执行文件与QT库和“libRinzoCore”链接。

    我可以毫无问题地编译“libRinzoCore”,它生成了两个文件“libRinzoCore.DLL”和“libRinzoCore.DLL.a”

    但是在编译“Rinzo.exe”时,它会提供以下输出:
    Linking CXX executable Rinzo.exe
    Info: resolving IRzPlugin::staticMetaObject       by linking to __imp___ZN9IRzPlugin16staticMetaObjectE (auto-import)
    Info: resolving IRzViewerPlugin::staticMetaObject        by linking to __imp___ZN15IRzViewerPlugin16staticMetaObjectE (auto-import)
    Info: resolving IRzLayeringPlugin::staticMetaObject        by linking to __imp___ZN17IRzLayeringPlugin16staticMetaObjectE (auto-import)
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: warning: auto-importing has been activated without --enable-auto-import specified on the command line.
    This should work unless it involves constant data structures referencing symbols
     from auto-imported DLLs.
    [100%] Built target Rinzo
    

    并且在执行“Rinzo.exe”时崩溃,并显示以下消息(这是日语错误消息的翻译)



    这是我的CMake文件

    libRinzoCore:

    http://www.keepandshare.com/doc/2199086/rinzocore-txt-august-31-2010-12-10-pm-2k?da=y

    Rinzo.exe:

    http://www.keepandshare.com/doc/2199085/rinzo-txt-august-31-2010-12-10-pm-5k?da=y

    如果我将“libRinzoCore”编译为静态库,它可以正常工作。
    并在Linux上正常工作。

    有小费吗?

    最佳答案

    在Windows上,您需要声明动态库的“导出”部分以使其工作。

    #ifdef Q_WS_WIN
    #ifdef RINZO_EXPORT
    #define RINZO_LIB __declspec(dllexport)
    #else
    #define RINZO_LIB __declspec(dllimport)
    #endif
    #else
    #define RINZO_LIB
    #endif
    

    然后,您需要将RINZO_LIB放在lib内的类声明的前面(仅您要“导出”的类,在外部代码中使用)
    class RINZO_LIB YourExportedClass
    {
    ...
    }
    

    最后一部分是在编译库时添加预处理器宏。如您所见,它是RINZO_EXPORT

    请记住,“导入”时(使用库外的代码)不要添加此预处理器宏。

    同样,所有函数都要求RINZO_LIB宏在库外部可见:
    RINZO_LIB void yourExportedFunction()
    {
    ...
    }
    

    关于c++ - C++ MinGW共享库问题(仅Windows,可在Linux上运行)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3606043/

    10-13 08:18