2014-08-30 69 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