大家问候,
我将MinGW,QT和CMake用于我的项目。
如图所示,我的项目有两个模块。
“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/