首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ MinGW共享库问题(仅适用于Linux)?

C++ MinGW共享库问题(仅适用于Linux)?
EN

Stack Overflow用户
提问于 2010-08-31 04:32:51
回答 1查看 2.1K关注 0票数 2

大家好,

我在我的项目中使用MinGW、QT和CMake。

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

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

"libRinzoCore“主要使用QT对象进行开发,并针对QT库进行链接。

"Rinzo.exe“也使用QT库对象,有些不在"libRinzoCore".So中使用--我不得不将QT和"libRinzoCore”与此可执行文件链接起来。

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

但是,在编译"Rinzo.exe“时,它提供了以下输出:

代码语言:javascript
复制
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“时,它会与消息一起崩溃(这是来自日语错误消息的翻译)

“应用程序无法正确穿孔(0xc0000005)。单击”确定“可取消”

这是我的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上工作得很好。

有小费吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-31 07:19:55

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

代码语言:javascript
复制
#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内部类声明的前面(只有要“导出”的类,在外部代码中使用)

代码语言:javascript
复制
class RINZO_LIB YourExportedClass
{
...
}

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

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

此外,所有函数都要求RINZO_LIB宏在库外可见:

代码语言:javascript
复制
RINZO_LIB void yourExportedFunction()
{
...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3606043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档