2013-04-29 100 views
0

目前我有一個應用程序和一個(靜態)庫,都是用Qt編寫的。作爲構建系統,我使用cmake。我將庫與target_link_libraries鏈接到可執行文件,一切工作正常(我有一個文件/可執行文件)。在應用程序和cmake中使用Qt共享庫的常見方法

但現在我想使用共享庫。創建一個共享庫add_library和關鍵字SHARED的作品,但我有點困惑的方式,如何加載共享庫。我看到了兩個 「辦法」:

  1. 寫一個庫,並使用Q_DECL_EXPORT/Q_DECL_IMPORT。他們使用QLibrary加載庫並使用類型轉換來解析所有(C)函數
  2. 編寫庫並將頭文件包含在應用程序中。共享庫通過cmake命令target_link_libraries「傳遞」給可執行文件。他們不使用QLibrary來加載庫。

現在我有幾個問題:

  1. 什麼是普通(「正常」)的方式來加載共享庫?使用__cdecl(方法1)將所有C++方法導出到C函數或包含頭文件(方式2)?其他方案?
  2. 與方式2(包含標題)相關 - 庫如何加載?由操作系統?如果我移動庫,應用程序無法找到庫 - >在運行時加載的庫?
  3. 有沒有一種方法來加載一個庫,而不包括頭或在編譯時使用它(運行時加載庫)?我看了有一種方法,但它不是那麼容易

我希望我的問題是明確的,而不是「noobish」,否則請寫一個評論

回答

0
  1. 我想第二個辦法是更常見,儘管我遇到了兩個。
  2. 第二種方式庫在應用程序啓動時由os加載。如果操作系統找不到庫 - 應用程序將無法啓動。
  3. 無論您使用哪種方法,您都需要知道函數的語義。這意味着您將包含標題,其中包含它們,這樣或那樣。

而且Qt的爲您提供了另一種方式來加載運行庫,使用插件方法:link

相關問題