2014-08-30 93 views
3

我的应用程序可以加载插件。插件可以使用主要可执行文件中的符号。MacOS X - 编译插件

它是用C++编写的Qt。我正在使用qmake来构建它。

在Linux下有一个弱链接,它允许编译和链接我的插件而不满足所有符号依赖关系(无论如何将由运行时加载应用程序提供)。

Windows需要满足所有符号。我通过-Wl,--export-all-symbols,--out-implib,libMyApp.a的帮助,设法用mingw32来做到这一点,它在链接插件时产生一个链接器使用的可执行文件中的符号表。

现在我遇到了MacOS X的一个问题,我不知道如何处理它。我在苹果的帮助here发现我应该编译我的插件不与-dynamiclib,但我应该使用-bundle -bundle_loader MyApp。问题是,qmake的力量-dynamiclib,我不知道如何禁用它。我也不知道使用这个“捆绑”选项是否有助于解决我的问题。

什么是使用qmake构建这样的插件的正确方法?

编辑/更新: 我从QtCreator中使用qmake。在编译TEMPLATE = lib时,qmake自动提供(并强制)-dynamiclib。当-dynamiclib提供给编译器时,它说我不能将-bundle_loader-dynamiclib一起使用。该消息表明它被禁止。因此,我正在寻找一种方法来删除-dynamiclib

是的,我已阅读qmake手册。不是“逐字”,但通常我在那里寻找我的问题,没有运气。

我使用Qt/qmake 5.3.1,QtCreator与Qt包(3.1.2)一起发货。

+0

你应该可以使用dynamiclib – 2014-09-01 16:41:44

+0

你能否澄清一下你的问题?你用什么IDE?哪个版本的Qt/qmake?你有没有读过qmake手册http://qt-project.org/doc/qt-5/qmake-manual.html? – 2014-09-02 07:42:31

+0

@Sergey:感谢您的评论,我更新了这个问题。 – Googie 2014-09-02 09:56:25

回答

2

here

使用的lib模板,下列选项可以被添加到配置变量来确定建库的类型:

插件 - 库是一个插件;这也启用了dll选项。

因此,尝试添加到您的.pro文件

macx:{ 
    CONFIG += plugin 
    QMAKE_LFLAGS_SHLIB -= -dynamiclib 
    QMAKE_LFLAGS_PLUGIN -= -dynamiclib 
    QMAKE_LFLAGS_PLUGIN += -bundle 
} 

同样可以控制编译标志为您的项目。

有关qmake变量的其他信息可以在here找到。

+0

谢谢谢尔盖。我不知道我是如何错过它的。我会在家里尝试并在确认工作后接受答案。 – Googie 2014-09-02 14:29:09

+0

不幸的是,这并没有改变任何东西。我查看了执行的编译命令,它们都是一样的,包括有问题的'-dynamiclib'。 – Googie 2014-09-02 16:36:11

+1

@Googie你能提供一个简短的例子吗?它可以是简单的项目,你的.pro文件在github上。另一种选择 - 投入一些时间在CMake构建工具http://cmake.org/cmake/help/v2.8.12/cmake.html#command:add_library。 QtCreator很好地集成了它。 – 2014-09-02 18:44:30