2017-10-20 211 views
1

我想從我爲C++項目編寫的所有函數中編譯一個靜態庫。我在Ubuntu 16.04上使用CodeLite 11.0.0,配置爲使用GCC作爲編譯器。如何使用Codelite 11.0.0編譯靜態庫?

我遵循CodeLite's tutorial中的說明,根據這些說明,這應該是可行的,並將項目類型從可執行文件更改爲靜態庫。

運行項目(CTRL + F5命令)後,我期望在/Debug文件夾中找到一個.a文件,可以與可執行文件一起使用,也可以代替可執行文件。但我所能找到的只是可執行文件和一些.o.o.d文件。當我將項目設置爲可執行文件時,我也一樣。

我試圖關閉並重新打開CodeLite,但沒有幫助。我無法找到任何官方/非官方的示例,說明如何使用CodeLite構建靜態庫。

有誰知道如何設置CodeLite來產生一個.a靜態庫文件?

+0

我建議開始學習cmake。它可以幫助你解決多個問題,並且如果正確寫入,它將簡化用戶的生活。 – Incomputable

+0

@Incomputable,謝謝你不是第一個。但我不是一個軟件開發人員,非常喜歡IDE和他們帶來的簡化。我確信有一種簡單的方法可以配置CodeLite來爲我做這件事,但我根本無法找到它。 – raggot

回答

2

正如你可能已經發現,CodeLite允許你從設置更改下拉菜單中 項目的類型 - >一般 - >項目類型

但是,這樣做並不會更改項目目標的名稱。所以,如果 你開始把你的項目作爲一個可執行myprog - 從中​​,也就是說, 調試版本產生./Debug/myprog的項目文件夾下 - 那麼 您更改項目類型靜態庫並重建它,調試 版本將仍然生成./Debug/myprog,但該文件實際上現在實際上是 是一個靜態庫,缺少通用的lib -prefix和.a擴展名。

爲了讓輸出文件的常規靜態庫的名字 - libmyprog.a - 你需要重新回到設置 - >一般和 變化輸出從文件:

$(IntermediateDirectory)/$(ProjectName) 

到:

$(IntermediateDirectory)/lib$(ProjectName).a 

然後重建項目和它會輸出一個目標一個靜態的 庫看起來像一個。

當然,你必須對項目設置相同的變化都 的調試如果你想讓他們都生產具有相同的文件類型和文件名 目標釋放配置。

但是...

如果將程序項目轉換爲靜態庫項目的方式不是 看起來很光滑,那可能是因爲它是非常少用的轉換。

在轉換後產生的將僅包含該程序是從建立在同一對象 文件,包括定義 原始程序的main函數的對象文件中的靜態庫。假設目標文件 爲main.o,並且它定義了鏈接器可以看到的0個或更多其他函數。

任何其他程序,newprog,即與靜態庫鏈接必須提供 自己的main功能在不同的目標文件,所以在任何這樣的聯動 兩件事情一定會發生: -

  • newprog的鏈接不需要在libmyprog.a(main.o), 中定義的任何函數,所以libmyprog.a(main.o)未鏈接並且可能不存在。

  • newprog聯動並需要一些功能,foo,在libmyprog.a(main.o)定義, 所以libmyprog.a(main.o)聯;那麼以及foo的定義, 程序鏈接main的重複定義 - 它自己的定義加上libmyprog.a(main.o)中的 。重複的定義是一個錯誤,所以連接失敗。

把一些程序的main函數的定義爲靜態 庫的成員是沒有意義的,因爲如果是以往任何時候都需要在另一個 程序的聯動裝置成員,那麼它的聯動將失敗。

所以你的程序項目轉換爲靜態庫項目需要事先給轉換一些 重構: -

  • 如果您在靜態庫需要的任何功能相同的源 文件中定義作爲main,那麼你需要把它從源文件中取出並定義它 是一個不同的。

  • 之後,從項目中刪除定義main的源文件。

  • 最後,轉換並重建項目。

你要做的是重構從原始程序的源代碼 一堆適合於建設成爲一個靜態庫的源文件中提取。

假設你這樣做,創建一個靜態庫 CodeLite的簡單的方法是創建一個項目爲此目的並在新建項目嚮導 選擇圖書館 - >靜態庫作爲項目類型而不是某種 的可執行文件。

然後只需將新的或現有的源文件添加到靜態庫項目 ,直到它包含您希望庫提供的所有函數的定義。構建,測試,調試,編輯...直到完成。

+0

謝謝,尤其是額外的提示!我遵循你的建議,實際上創建了一個單獨的項目,其中包含我想要在靜態庫中組裝在一起的所有源文件。你的回答是令人愉快的週一上午的驚喜。 – raggot