2012-09-02 74 views
1

我已經在Lib_file.h和Lib_file.cpp中編寫了一些代碼。我希望將此代碼轉換爲靜態庫。我能夠編譯代碼(使用命令g++ -I <necessary include files> -o Lib_file.o Lib_file.cpp)來獲取Lib_file.o。我也可以使用ar rvs Lib_file.a Lib_file.o命令將其添加到檔案中。現在,當我嘗試在使用-L選項的其他代碼中使用此庫時,出現未定義的引用錯誤。這個錯誤指向我的Lib_file.o中的代碼。所以我的問題是如何獲得我的Lib_file.cpp中的代碼鏈接到它使用的庫。用於創建靜態庫的鏈接庫

我曾嘗試以下選項至今

I.創建Lib_file.o後,我嘗試下面的命令 g++ -L<include path> -l<.a files> Lib_file.o。在執行此命令時,出現以下錯誤:

 
/usr/lib/../lib64/crt1.o: In function `_start': 
init.c:(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 

II。我嘗試使用ar命令將所有必需的.a文件與我的Lib_file.o一起包含在新的存檔中。儘管如此,我得到未定義的引用錯誤,當我嘗試使用Lib_file.a庫與我的應用程序

請幫我在這裏

+1

我強烈建議作出*共享庫*的,不是一成不變的。參見http://stackoverflow.com/a/12197285/841108 –

+1

在Linux上,一個.a文件只是一個包含一堆.o文件(已編譯但未鏈接)的便利歸檔文件。它沒有元數據。與.a文件鏈接基本上與單獨鏈接.o文件相同。至於.o文件,.a文件無法指示其外部依賴庫。您需要在構建系統中分別跟蹤並在鏈接時將信息提供給鏈接器。 –

+0

@BasileStarynkevitch:感謝有用的帖子 –

回答

4

首先,所有的庫通常命名爲類似libxyz.a其中xyz是名稱的圖書館。

其次,您嘗試僅使用您用於庫的對象文件創建程序,並將其與自身鏈接。這當然不起作用,因爲庫沒有正常程序所需的main功能。你必須創建另一個程序,並鏈接那一個與庫。

gcc myotherprogram.c -o myotherprogram -L/some/path -lxyz 

正如你可以在我的命令行見上面,我把圖書館最後在命令行上。這是需要的,因爲鏈接器以反轉順序查找依賴關係。

編輯:將靜態庫鏈接到其他庫:您不需要。靜態庫是完全獨立的,如果它需要其他庫本身工作,那麼編譯實際程序時,它們必須出現在命令行上。

例如,可以說庫xyz依賴於標準的數學庫(即m庫)。您創建xyz庫時不能「鏈接」,因爲您實際上沒有鏈接靜態庫,只是將一組目標文件放在一個歸檔中(ar.a擴展名用於歸檔)。當你構建一個需要xyz庫,您還需要與任何庫鏈接實際的應用程序,xyz需求:

gcc myotherprogram.c -o myotherprogram -L/some/path -lxyz -lm 
+0

+1最後一行.. :) – perilbrain

+0

我想我可能一直不清楚我的問題。我面臨的問題是,當我執行你提供的命令行時,我得到了我使用-l鏈接的庫中的代碼的未定義參考錯誤。我的問題是,對於庫代碼libxyz.cpp,如果它正在使用其他庫,那麼我該如何將這些庫鏈接到這個庫。 –

+0

@MananShah您需要在編譯完成的程序時添加庫需要的所有庫。更新了答案以反映這一點。 –