[英]Compiling an external library on Linux
今天是個好日子,
注意:此問題已解決-我在答案部分提供了自己的解決方案,但是Jonathan提供的解決方案要短得多。 不過,這是我最初發布的以下問題:
我基本上是在嘗試在Linux上編譯一個串行庫(用於UART通信),但是我不確定如何正確編譯(我在下面已經提到了我所做的一切),任何建議都是非常有價值的。 我正在使用serialib庫-它由2個主要文件( serialib.h和serialib.cpp )組成,您可以在此處直接查看這些文件的源代碼(一直滾動到底部,並在新選項卡中查看文件): http : //serialib.free.fr/html/classserialib.html
我將這些文件(serialib.h和serialib.cpp)傳輸到運行Debian(Wheezy),g ++ / gcc(Debian 4.6.3-14)4.6.3的BeagleBone Black微控制器。 我編寫了自己的程序( uart.cpp是我的文件名)來訪問該庫提供的功能,這就是我寫的:
#include <iostream>
#include "serialib.h"
#ifdef __linux__
#define DEVICE_PORT "/dev/ttyO1"
#endif
int main()
{
serialib LS;
return 0;
}
如您所見,我正在嘗試訪問“ seriallib”類。 serialib.h,serialib.cpp和uart.cpp都位於主目錄中。 我還手動將iostream庫添加到serialib.cpp中,因為我沒有在原始源代碼中聲明它。
現在我真的不確定如何編譯此類外部庫,但到目前為止,我嘗試了以下步驟:
distcc [3142](dcc_parse_hosts)警告:/home/debian/.distcc/zeroconf/hosts不包含主機。 無法分發工作distcc [3142](dcc_zeroconf_add_hosts)嚴重! 無法解析主機文件。 distcc [3142](dcc_build_somewhere)警告:分發失敗,而是在本地運行
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../arm-linux-gnueabihf/crt1.o:在函數_start': (.text+0x30): undefined reference to
main的_start': (.text+0x30): undefined reference to
'collect2:ld返回1退出狀態distcc [3210]錯誤:在本地主機上編譯serialib.cpp失敗
到目前為止,我仍然在尋找如何編譯它的方法,如果我設法解決這個問題,那么我也將在這里發布我的解決方案。 同樣,任何建議都將非常有價值。 謝謝你們 :) 。
g++ -c -Wall -Werror -fPIC serialib.c
轉換為產生以下錯誤的PIC:
“錯誤”不是錯誤,而是警告,告訴您distcc設置已損壞,但已在本地編譯。
該命令不會“轉換為PIC”,而是會編譯文件serialib.c
並生成一個已編譯的目標文件serialib.o
g++ serialib.cpp -L /home/debian/serialib.h
這只是胡說。 它嘗試從serialib.cpp
構建程序,並使用目錄/home/debian/serialib.h
(不是目錄!)查找庫。
您無需“編譯庫”,只需編譯兩個源文件並將它們鏈接到一個程序中即可。 要么:
g++ -c serialib.cpp
g++ -c uart.cpp
g++ serialib.o uart.o -o uart
或多合一命令:
g++ serialib.cpp uart.cpp -o uart
您應該閱讀《 GCC入門》以了解這些命令,而不僅僅是輸入偽造的命令而不了解它們。
我已經找到了解決這個問題的方法,希望這對以后遇到類似問題的讀者有所幫助。 我有我要編譯的自己的源代碼uart.cpp(問題中給出),外部庫是serialib ,其中包含兩個主文件(serialib.h和serialib.cpp),您將希望將以下命令替換為尊重您擁有的文件
步驟1:使用位置無關代碼進行編譯
g ++ -c -Wall -Werror -fpic serialib.cpp
步驟2:建立共用資料庫
g ++ -shared -o libserialib.so serialib.o ,這里的庫是libserialib.so 。
步驟3:將您的源代碼與庫鏈接
g ++ -L / home / debian -lserialib uart.cpp -o uart
g ++ -L / home / debian -Wall -o測試uart.cpp -lserialib
您可以將庫保存在其他路徑中,並且當然可以使用其他名稱。 假設您在目錄/ home / user / myDir中有一個名為libabc.so的庫,那么命令將類似於:
g ++ -L / home / user / myDir -labc your_code.cpp -o your_code
g ++ -L / home / user / myDir -Wall -o測試your_code.cpp -labc
test
是自己的程序,lserialib實際上是在尋找libserialib.so而不是serialib.o,因為gcc / g ++假定所有庫都以lib
開頭,以.so或.a結尾,並且您可以看到labc也是如此對於libabc.so,因此確保您的庫名稱以lib
開頭並以.so或.a結尾很重要
步驟4:在運行時使庫可用
在這里,我們提供了庫的實際存儲路徑,我將其保存在目錄/ home / debian中,這就是我的命令如下所示的原因:
導出LD_LIBRARY_PATH = / home / debian:$ LD_LIBRARY_PATH
如果您的庫保存在/ path / to / file中,則命令將如下所示:
導出LD_LIBRARY_PATH = /路徑/到/文件:$ LD_LIBRARY_PATH
這是為了幫助加載程序找到共享庫並查看此路徑: echo $ LD_LIBRARY_PATH並取消設置: unset LD_LIBRARY_PATH
要執行程序類型..test或./uart,並且在對主源代碼進行任何修改的情況下(在這種情況下為uart.cpp),只需重復步驟3。我發現以下鏈接非常有用: http:// www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html 。 感謝所有花時間閱讀此問題的人,尤其是那些給我建議的人。 如果有人有更多或更好的解決方案,請隨時在此處發布以幫助將來的讀者:)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.