正如你可能已經發現,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
函數的定義爲靜態 庫的成員是沒有意義的,因爲如果是以往任何時候都需要在另一個 程序的聯動裝置成員,那麼它的聯動將失敗。
所以你的程序項目轉換爲靜態庫項目需要事先給轉換一些 重構: -
你要做的是重構從原始程序的源代碼 一堆適合於建設成爲一個靜態庫的源文件中提取。
假設你這樣做,創建一個靜態庫 CodeLite的簡單的方法是創建一個項目爲此目的並在新建項目嚮導 選擇圖書館 - >靜態庫作爲項目類型而不是某種 的可執行文件。
然後只需將新的或現有的源文件添加到靜態庫項目 ,直到它包含您希望庫提供的所有函數的定義。構建,測試,調試,編輯...直到完成。
我建議開始學習cmake。它可以幫助你解決多個問題,並且如果正確寫入,它將簡化用戶的生活。 – Incomputable
@Incomputable,謝謝你不是第一個。但我不是一個軟件開發人員,非常喜歡IDE和他們帶來的簡化。我確信有一種簡單的方法可以配置CodeLite來爲我做這件事,但我根本無法找到它。 – raggot