2012-02-11 48 views
0

我正在幫助一個C++應用程序。該應用程序非常大,分佈在不同的子目錄之間。它使用腳本爲每個項目目錄自動生成qt .pro文件,並使用qmake生成make文件。目前這些庫正在按字母順序編譯..這顯然會導致鏈接錯誤,當它試圖鏈接的庫尚未建立..是否有某種類型的g ++標誌,我可以設置,所以它不會錯誤,如果一個庫它的試圖鏈接尚未建成?或通過qt .pro文件首先構建依賴關係的方法?g ++鏈接.so庫可能尚未編譯

注意: 這個腳本在ubuntu 10.10上工作正常,因爲構建共享庫的語句並不要求我使用-l(libraryname)鏈接到我的其他庫,但是ubuntu 11.10這樣做是因爲它給了我未定義的引用錯誤在11.10編譯時。

+4

聽起來像你需要一個適當的Makefile。 – 2012-02-11 00:24:10

+0

你確定它不只是與Ubuntu中的一些先前建立的庫鏈接?我看不出它是如何成功鏈接到不存在的庫文件的。 – 2012-02-11 00:42:24

+0

不應該。它是在我們的代碼生成庫的地方給出錯誤的庫。清潔重建在10.10上正常工作。 11.10給了我未定義的參考錯誤。 – user1203141 2012-02-11 00:45:54

回答

1

你有看着使用Qt Creator中爲構建環境和IDE?我個人從未在Ubuntu上使用它進行開發,但我已經在Windows上使用g ++,並且它在那裏工作得很好。它似乎已經可以作爲package in the repository

你們當中有些人利用它獲得的優點是:

  • Qt創建者會(一般)管理的.pro文件給你。 (如果你像我一樣,你仍然可以添加許多額外的東西在這裏,但它會自動添加的.cpp,.h和的.ui文件,因爲它們被添加到項目中。)
  • 可以建立跨 - 項目依賴關係,將按照他們需要鏈接的任何順序構建項目。
  • 您可以使用它與gdb的集成來逐步執行和調試代碼,以及跳轉到代碼。
  • 你得到Qt的信號和槽自動完成,以及內嵌語法高亮和一些錯誤檢查。
  • 如果您正在使用GUI,則可以使用集成設計器以可視化的方式佈置和設計表單。

回想一下你的實際問題,我認爲當鏈接失敗時,標誌告訴gcc不會錯誤,因爲鏈接器沒有辦法讓鏈接器懶洋洋地鏈接庫。如果它鏈接到靜態庫(.a),那麼它需要能夠將該代碼的實現複製到可執行文件/庫中。如果它的動態鏈接(.so),它仍然需要驗證所需的函數實際存在於庫中。如果它在鏈接步驟中無法鏈接,它何時可以鏈接?如果在編譯過程中存在循環依賴關係(A取決於B,C取決於C,C取決於A),那麼您可能需要有一個僞造的庫版本首先,它只有用於實現每個函數的空存根,以及每個類或對象的完整定義。然後,在建立鏈接時創建其他所有內容,最後構建假庫的實際版本,並將其鏈接到已鏈接的所有其他版本。不過,我認爲這隻適用於動態鏈接。

1

你可以使用一個子目錄項目有超過構建順序控制(不管其他開發是否願意與否:))。

E.g.

build_all.pro

TEMPLATE=subdirs 
CONFIG+=ordered 
SUBDIRS=lib2/lib2.pro lib1/lib1.pro app/app.pro 

的lib1.pro,lib2.pro,......是你的親生成的文件。 然後爲build_all.pro運行一次qmake,並在該目錄中運行make。這將在lib1和app之前構建lib2。