簡體   English   中英

在Linux上編譯外部庫

[英]Compiling an external library on Linux

今天是個好日子,

注意:此問題已解決-我在答案部分提供了自己的解決方案,但是Jonathan提供的解決方案要短得多。 不過,這是我最初發布的以下問題:

我基本上是在嘗試在Linux上編譯一個串行庫(用於UART通信),但是我不確定如何正確編譯(我在下面已經提到了我所做的一切),任何建議都是非常有價值的。 我正在使用serialib庫-它由2個主要文件( serialib.hserialib.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中,因為我沒有在原始源代碼中聲明它。

現在我真的不確定如何編譯此類外部庫,但到目前為止,我嘗試了以下步驟:

  1. g ++ -c -Wall -Werror -fPIC serialib.c轉換為產生以下錯誤的PIC:

distcc [3142](dcc_parse_hosts)警告:/home/debian/.distcc/zeroconf/hosts不包含主機。 無法分發工作distcc [3142](dcc_zeroconf_add_hosts)嚴重! 無法解析主機文件。 distcc [3142](dcc_build_somewhere)警告:分發失敗,而是在本地運行

  1. g ++ serialib.cpp -L /home/debian/serialib.h顯示以下錯誤:

/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失敗

到目前為止,我仍然在尋找如何編譯它的方法,如果我設法解決這個問題,那么我也將在這里發布我的解決方案。 同樣,任何建議都將非常有價值。 謝謝你們 :) 。

  1. g++ -c -Wall -Werror -fPIC serialib.c轉換為產生以下錯誤的PIC:

“錯誤”不是錯誤,而是警告,告訴您distcc設置已損壞,但已在本地編譯。

該命令不會“轉換為PIC”,而是會編譯文件serialib.c並生成一個已編譯的目標文件serialib.o

  1. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM