顯示具有 GCC編譯 標籤的文章。 顯示所有文章
顯示具有 GCC編譯 標籤的文章。 顯示所有文章

2022年7月11日 星期一

用GCC編譯包含autogen.sh的軟體

以前使用GCC編譯的原始碼通常會是tarball,也就是用x.tar.gz包起來的樣子。解開以後會在資料夾裡面找到configure這個編譯前設定的腳本,完成後會產生Makefile,之後再用make來將軟體編譯出來。隨著軟體越來越大,configure之後又出現了automake,若在原始碼資料夾裡面看到autogen.sh這個檔案就是這種狀況。編譯這種軟體,首要先安裝auto相關工具:

  • sudo apt-get install autoconf automake libtool

其次用下面指令產生configure需要的相關檔案:

  • ./autogen.sh

2022年7月8日 星期五

Ubuntu 20.04安裝舊版GCC-5編譯器

Ubuntu 20.04預設的gcc版本是9.4.0,可用apt安裝gcc-8,但是gcc 7(含)以下就無法安裝。解決方法是先修改/etc/apt/sources.list,增加下面兩行:

deb http://dk.archive.ubuntu.com/ubuntu/ xenial main
deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe

上面加入了Ubuntu 16.04 Xenial Xerus (好客的非洲地松鼠)的套件庫,完成後執行

2022年1月1日 星期六

安裝linux-fincore 1.3.0到Debian 8.8

在Linux上面要檢查某個檔案有冇被快取在記憶體上,可以用linux-fincore這個指令。但這指令沒有被APT給收錄,也找不到.deb包可以用dpkg安裝。下面介紹安裝過程

Step 1:下載source code,安裝編譯環境需要的套件

到Google Code Archive的linux-ftools,找到source後下載。

wget https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/linux-ftools/source-archive.zip
mv source-archive.zip linux-ftools-1.3.0.zip
md5sum linux-ftools-1.3.0.zip

這邊算出來的md5 checksum是 ae142ebe7c1448d20ec42756d64adf08

2020年6月18日 星期四

CentOS 6上編譯GCC 4.8.5

CentOS 6上面預設的編譯器是GCC-4.4.7,自行編譯一套GCC-4.8.5的步驟如下:
  1. 安裝GMP,這邊選4.3.2版
  2. 安裝MPFR,這邊選2.4.2版
  3. 安裝MPC,這裡選0.8.1版
  4. 安裝ISL,這裡選0.14版
  5. 下載GCC-4.8.5原始碼,設定編譯與安裝

2020年6月17日 星期三

gnu/stubs-32.h: No such file or directory

在CentOS 6的機器上編譯GCC-4.8.5的時候,出現錯誤訊息:
  • gnu/stubs-32.h: No such file or directory

這是因為缺少32-bit C library,最簡單的解決方式是在編譯GCC時,在configure那個步驟加入下面的參數,把32-bit的支援給關掉:
  • --disable-multilib

2020年2月26日 星期三

Python編譯使用--enable-optimizations

在編譯Python-3.5.6的時候,一開始的configure注意到了有--enable-optimizations。編譯的過程大概就是:
  1. ./configure --enable-optimizations
  2. make -j 16 && make install

打開上述選項在編譯的時候會啟動下面兩項最佳化:

2018年10月22日 星期一

縮小initial ramdisk檔案initrd的大小

製作完開機核心後,也會更新模組modules,因此要順便更新inital ramdisk這個放在/boot/initrd-x.x.x.x的檔案。有時候這個檔案會很大(幾百MB),這是因為編譯出來的modules裡面的debug information沒有被去除,故modules會變很大。解決方法是在編譯與安裝modules的時候用下面的指令(需要root權限):
  • make INSTALL_MOD_STRIP=1 modules_install
上面這個指令讓在編譯modules的時候,會使用--strip-debug來去除debug information

2018年9月25日 星期二

比較MPI與OpenMP的差異

會有MPI與OpenMP的差異起因於:
  • 以前的主機只有單CPU,為了要讓程式可以透過網路在不同的主機上面平行處理,因此發展出了 MPI
  • 後來CPU從單核心變成的多核心,為了讓程式可以在單機多核心上面平行處理,因此發展出了 OpenMP
  • 現代的機器已經是多CPU多核心,所以出現了 Hybrid OpenMP+MPI,先透過MPI將大工作分成小工作平行給不同的CPU,再透過OpenMP將這些小工作分成執行緒平分給不同的核心去執行
不管是上述的哪一種,都是讓平行化程式的解法

2018年5月11日 星期五

編譯時出現/usr/bin/ld: cannot find -ldxxx

在編譯static executable的時候,有時候會出現下面的錯誤訊息:
  • /usr/bin/ld: cannot find -lm
  • /usr/bin/ld: cannot find -lc
  • collect2: error: ld returned 1 exit status
意思就是說,在連結的時候缺少了libm與libc這兩個函式庫(注意-lm配的是libm、-lc配對的是libc),但用下面的指令測試:

2018年3月27日 星期二

靜態函式庫.a 共享與動態函式庫.so

使用GCC編譯原始碼產生可執行檔(executable),連結部分要選擇做靜態函式庫(Static library或static-linked library)與動態連結函式庫(Dynamic library或dynamic-link library或Shared library)。通常這些函式庫的名稱如下:
  • 靜態函式庫:lib*.a
    • 鏈結的時候函式庫會整合到執行檔中,執行檔大
    • 執行的時候,不需要再去找函式庫
    • 升級函式庫之後,需要再次編譯一次執行檔
    • 可以使用ar與ranlib指令將多個.o的檔案合併成為.a
  • 動態函式庫:lib*.so
    • 將多個.o的時候函式庫不會整合到執行檔中,執行檔小
    • 執行的時候,需要再去找函式庫檔案,而且所在目錄不能改變
    • 升級函式庫之後,不需要重新編譯執行檔
    • 在Windows裡面檔名叫*.dll 
要辨別某個執行檔PROGRAM是靜態連結還是動態連結,使用ldd這個指令:
  • ldd PROGRAM
  • ldd -v PROGRAM

2018年3月22日 星期四

Debian 7.11上編譯GCC 5.5.0

Debian 7.11 (wheezy)預設的GCC是4.7.2,這邊想要編譯GCC 5.5.0。參考《Installing GCC》一文建議的函式庫版本:
  • GNU Multiple Precision Library (GMP) version 4.3.2 (or later)
  • MPFR Library version 2.4.2 (or later)
  • MPC Library version 0.8.1 (or later)
然後還要先安裝一些軟體:
  • sudo apt-get install gcc-multilib
  • sudo apt-get install autogen
接著依照下面的順序執行:

2015年12月17日 星期四

在Asus RT-N66U原廠韌體上面安裝iperf服務,測量連線速度

測量網路頻寬,iperf是款很簡易的指令工具,可以運行在Windows, Linux, MacOS X, FreeBSD, Docker, Android, iOS等等各式各樣的平台上面,而且也有提供原始碼。

iperf使用方法簡易,先在某台機器上面先跑iperf service,其他的機器就可用iperf client去連線,測量兩者之間的網路頻寬。這server/client則都是整合在同一個程式,執行方法如下:
運行iperf service
$ iperf -s
執行iperf client   $ iperf -c ip_of_iperf_server