2015/3/30

【樹莓派】編譯一個Hello World程式在RPi上執行

要在PC上編譯一個可以在Raspberry Pi上執行的程式必須透過Cross-Compile才能達成。Cross-Compile的意思就是在A架構電腦(比如你用的一般電腦)上編譯B架構電腦(比如樹莓派)能執行的二進位程式,為了讓電腦能夠Cross-Compile出樹莓派能接受的執行檔,須要先在電腦上安裝Cross-Compiler:
1
sudo apt-get install gcc-arm-linux-gnueabi
這裡寫了一個簡單的Hello World程式做為示範
1
2
3
4
5
6
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello Raspberry Pi!\n");
}
透過剛安裝的Cross-Compiler進行編譯:
1
arm-linux-gnueabi-gcc -o hello hello.c
產生的執行檔可以使用file指令查看執行檔格式是否為ARM架構
若正確則可將檔案放到樹莓派上執行,應該可以得到下列結果:

2015/3/18

解決呼叫某些系統函數發生'無法解析的外部符號'問題的兩種方法

Windows有些系統函數被存放在像是Shlwapi.lib函數庫中而非常用到的kernel32.lib,在Visual Studio編譯環境中,Linker預設是不會去找Shlwapi.lib等較不常用的Library進行鏈結,所以當呼叫到如PathFileExists等系統函數,編譯過程中就會收到類似錯誤:
1>Source.obj : error LNK2001: 無法解析的外部符號 __imp__PathFileExistsA@4
1>E:\Tmp\ConsoleApplication13\Release\ConsoleApplication13.exe : fatal error LNK1120: 1 個無法解析的外部符號
1>
1>建置失敗。

解決方法有兩種:
其一是透過設定專案屬性→連結器→輸入→其他相依性,加入*.lib(如Shlwapi.lib)
其二是透過假指令#pragma告知編譯環境將調用到*.lib
#pragma comment(lib, "Shlwapi.lib")