顯示具有 [Linux]編譯 標籤的文章。 顯示所有文章
顯示具有 [Linux]編譯 標籤的文章。 顯示所有文章

2025年4月24日 星期四

MSYS2 編譯器通常放哪

MSYS2 通常安裝在 C:\msys64,那編譯器位置就根據你安裝的 toolchain(如 mingw64、ucrt64、clang64) 而定。

🎯 常見 MSYS2 編譯器路徑對照表

✅ 如果你使用的是 MinGW-w64 (64-bit GCC):

Toolchain編譯器 binary 路徑常用變數名
mingw64C:\msys64\mingw64\bin\gcc.exex86_64-w64-mingw32-gcc
ucrt64C:\msys64\ucrt64\bin\gcc.exe(有時改成 ucrt gcc)
clang64C:\msys64\clang64\bin\clang.execlang for Windows
msys2(純 POSIX)C:\msys64\usr\bin\gcc.exe(不建議用來編 Win binary)只適合 MSYS shell 程式

2025年3月9日 星期日

在cmake中印debug msg

在 CMake 中輸出調試信息,可以使用 message() 函數。這個函數允許你在 CMake 配置過程中打印訊息到命令行,對於調試 CMake 配置或檢查變數的值非常有用。

使用 message() 函數印出調試訊息

基本語法:

message([<mode>] "your message")

其中,<mode> 可以是以下幾個選項之一:

  • STATUS: 默認模式,會以普通訊息的形式顯示。
  • WARNING: 顯示警告訊息,會以黃色的警告形式顯示。
  • AUTHOR_WARNING: 只有當你在 CMake 中啟用了 CMAKE_SUPPRESS_DEVELOPER_WARNINGS 時,這個訊息才會顯示。
  • SEND_ERROR: 顯示錯誤訊息,並且會中止 CMake 的處理過程。
  • FATAL_ERROR: 顯示致命錯誤訊息,並且立即終止 CMake 的處理過程。

2025年2月9日 星期日

Cross compile openssl to aarch64


主要功能

加密與解密:

OpenSSL提供了多種對稱加密(如AES、DES、3DES、RC4等)和非對稱加密演算法(如RSA、DSA、ECC等),用於資料的加密和解密。

對稱加密使用相同的金鑰進行加密和解密,而非對稱加密使用一對金鑰(公鑰和私鑰)進行加密和解密。

SSL/TLS協定:

OpenSSL實現了SSL(Secure Sockets Layer)和TLS(Transport Layer Security)協議,用於安全的資料傳輸。

這些協定保護網頁瀏覽、電子郵件通訊、文件傳輸等的安全性。

數位憑證:

OpenSSL支援數位憑證的產生、簽署和驗證,包括X.509憑證。

數位憑證用於身份驗證和建立安全通訊連接,包含了公鑰和其他識別訊息,由受信任的憑證授權單位(CA)簽署。

2025年2月6日 星期四

configure的 -- 功能

-- 用来 区分不同的工具或构建系统的选项,以便它们能够正确地解析和处理。-- 是用于 分隔选项 的标记,它在许多构建工具(如 cmake 和 configure 脚本)中被使用来明确分隔命令行选项和随后的参数。

不可以将给 CMake 的选项写在 -- 之前、给 Qt 的选项写在 -- 之后,因为它们属于两个不同的构建系统,并且 -- 有明确的作用,决定了哪些选项是传递给 Qt 配置脚本的,哪些是传递给 CMake 的。

关键点:

  • -- 的作用:-- 用来 分隔不同工具的选项。它告诉构建系统,接下来所有的选项都属于 CMake,而之前的选项则是给 Qt 配置脚本使用的。

  • 顺序和语法很重要:构建过程中的不同工具和脚本有不同的选项解析方式。Qt 配置脚本和 CMake 对选项的处理方式不同,因此它们的选项必须按正确的顺序传递。

編譯時的configure選項 extprefix 和 prefix 的差異

在配置和編譯過程中,--prefix 和 --extprefix 都是用來指定安裝目錄的位置,但它們有不同的作用和用途。

1. --prefix 的作用

--prefix 是在配置源代碼時常用的選項,指示編譯器在安裝過程中將程序、庫、可執行文件等安裝到哪個目錄。當你指定 --prefix 時,所有的安裝文件(例如庫、頭文件、可執行文件等)會被安裝到這個指定的目錄。

例如:

./configure --prefix=/opt/mysoftware

這會將編譯出來的應用程式安裝到 /opt/mysoftware 目錄下,並且你在這個目錄下會找到類似於 bin/、lib/、include/ 這樣的子目錄來存放可執行文件、庫文件和頭文件。

2023年7月13日 星期四

sed can't read "xxx.la" no such file or directory

 遇到這個情況通常是編譯的AAA.lib所依賴的BBB.lib裡的引用到的xxx.lib的xxx.la路徑不對或不存在,將xxx.lib重編,再重編BBB.lib和AAA.lib就可以了。

這通常在cross compile時遇到,當toolchain是從別人那拿來時,裡面的pkgconfig下的*.pc檔,裡面的路徑很有可能都是原來建立者的電腦上的路徑。這樣在編譯的時候如果用pkgconfig去引用lib就會產生錯誤。

另一個方法是去把所有*.pc的檔案裡的路徑一個個改成你開發環境裡的路徑...

2023年6月12日 星期一

編譯器基礎

編譯器的構成

傳統的編譯器通常分為三個部分,前端(frontEnd),優化器(Optimizer)和後端(backEnd). 在編譯過程中,前端主要負責詞法和語法分析,將源代碼轉化為抽象語法樹;優化器則是在前端的基礎上,對得到的中間代碼進行優化,使代碼更加高效;後端則是將已經優化的中間代碼轉化為針對各自平台的機器代碼。

不光靜態語言如此,動態語言也符合上面這個模型,例如 Java。 JVM 也利用上面這個模型,將 Java 代碼翻譯為Java bytecode。這一模型的好處是,當我們要支持多種語言時,只需要添加多個

2023年5月28日 星期日

【Linux】Compile 錯誤與解決 筆記

error: 

this statement may fall through [-Werror=implicit-fallthrough=]

Solve:

make CFLAGS='-Wno-implicit-fallthrough'

2022年3月21日 星期一

2022年2月21日 星期一

【暫存】gcc筆記

gcc signal_emit_demo.c -o signal_emit_demo -D_REENTRANT -lpthread `pkg-config --cflags --libs gtk+-2.0`

-c 編譯但不連結,將程式碼變成.o的object檔

-D 定義常數,表示有定義,在程式碼裡可以用#ifdef來判斷

-l 使用程式庫,以上例來說是使用pthread程式庫

-S 輸出組譯碼

-E 顯示預處理 (define, macro) 的結果

-o filename 指定輸出檔名

-ansi 只支持 ANSI 標準的 C 語法。這一選項將禁止 GNU C 的某些特色 例如 asm 或 typeof 關鍵詞。

-Dmacro 定義指定巨集為有效

-Dmarco=defn 定義指定巨集為 defn

-Wa,option 將選項 (option) 傳給組譯器

-wl,option 將選項 (option) 傳給連結器

-I 增加 include header 檔案的搜尋路徑

-L 增加 library 檔案的搜尋路徑

-l 指定連結的函式庫

-Wall 顯示所有的警告訊息

-g 編入除錯資訊 (使用 GDB 除錯時用)

-shared 生成共享目標文件。通常用在建立共享庫時。

-static 禁止使用共享連接。

-UMACRO 取消對 MACRO 宏的定義。

-w的意思是關閉編譯時的警告,也就是編譯後不顯示任何warning,因為有時在編譯之後編譯器會顯示一些例如數據轉換之類的警告,這些警告是我們平時可以忽略的。

2022年1月13日 星期四

cmake筆記

cmake編譯

cmake 的命令列使用方式為cmake -D<variable>="<value>" <CMakeLists.txt path>。

-D 選項可用來指定編譯時需要的變數內容 。

CMakeLists.txt path:頂層CMakeLists.txt 所在位置


EX

cmake -DCMAKE_CXX_COMPILER="clang++” -DCMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++" ../source。

2021年7月1日 星期四

【Linux】Meson的基本用法

Meson是基于python3实现,至少需要python3.5才能运行,默认采用ninja作为后端。

在Ubuntu下最简单的是通过pip3安装


Install

1 $ sudo apt-get install python3 python3-pip ninja-build

2 $ sudo pip3 install meson

3 $ 指定版本安裝 pip install meson==0.55

2021年6月28日 星期一

【Linux】pkg-config

1. pkg-config --list-all

列出所有可使用的連結庫,位置在 /usr/lib/pkgconfig 及 /usr/local/lib/pkgconfig 裏面的 xxx.pc 檔,新軟體一般都會安裝 .pc 檔,沒有可以自己建立,並且設定環境變數 PKG_CONFIG_PATH 供 pkg-config 尋找 .pc 檔路徑。


2. pkg-config --cflags xxxx

取得該連結庫的 CFLAGS 參數。(Cflags)


3. pkg-config --libs xxxx

【linux】gcc標頭檔案、庫的路徑及搜尋順序

介紹gcc標頭檔案指定方法,gcc動態連結函式庫的方法以及路徑指定,搜尋路徑順序問題。

一.#include <>與#include “”

#include <>直接到系統指定的某些目錄中去找某些標頭檔案。

#include “”先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。


二.gcc指定標頭檔案的三種情況:

1.會在預設情況下指定到/usr/include資料夾(更深層次的是一個相對路徑,gcc可執行程式的路徑是/usr/bin/gcc,那麼它在實際工作時指定標頭檔案頭徑是一種相對路徑方法,換算成絕對路徑就是加上/usr/include,如#include 就是包含/usr/include/stdio.h)

【Linux】查看執行檔需要的library

列出程式中未定義需要外部提供的 symbol

nm -Du 列出程式中未定義需要外部提供的 symbol,就是除了你自己寫的變數、函式等以外,從include來的那些lib裡定義的。


列出需要的 shared library

ldd /bin/ls

或 

2021年5月10日 星期一

從一個.c檔案開始的auto makefile

這是一個最基本能自動產生makefile的範例。在專案根目錄下準備好所有的*.c、*.h

整個Autotools的流程圖:

取自http://en.wikipedia.org/wiki/GNU_build_system

1.執行autoscan自動產生configure.scan

手動重新命名為configure.ac,修改configure.ac內容:

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])

AC_INIT([hello], [0.1.0])

AM_INIT_AUTOMAKE([subdir-objects])

2021年3月30日 星期二

【Linux】gcc 編譯 Static、Shared Library與Dynamically loaded libraries

Static libraries

把一堆object檔用ar(archiver)包裝集合起來,檔名以".a" 結尾。

優點

執行效能通常會比shared libraries與dynamically loaded快,

不易發生執行時找不到library或版本錯置而無法執行的問題。

2021年3月19日 星期五

makefile調用所有子目錄

makefile代碼

SUBDIRS = $(shell find . * -type d | grep -v "\.")

.PHONY:all clean

all:
        @for subdir in $(SUBDIRS); do                   $(MAKE) -C $$subdir;            done

clean:
        @for subdir in $(SUBDIRS); do                   $(MAKE) -C $$subdir clean;        done

說明:

1. 使用shell find方法調出當前目錄所有子目錄

2020年10月18日 星期日

makefile筆記

基本的makefile

  1. OUTDIR = ./output
  2. CC = gcc
  3. LINK = gcc -o
  4. CFLAG = -c -O2 -o
  5. OBJECTS= $(OUTDIR)/1.o $(OUTDIR)/2.o $(OUTDIR)/main.o
  6.  
  7. all : $(OUTDIR) foo.exe
  8.  
  9. $(OUTDIR) :
  10. mkdir $@
  11.  
  12. foo.exe : $(OBJECTS)
  13. $(LINK) $@ $(OBJECTS)
  14.  
  15. $(OUTDIR)/%.o : %.c
  16. $(CC) $(CFLAG) $@ $<