2013年1月30日 星期三

[C/C++][GCC] 確認某個檔案是否真的有被included 的方法

通常一個大型project, 很多header files會被incldued, 但是往往有時候目錄與檔案結構你可能不熟析, 或者一堆人同時在修改開發, 這時候你可能會想要撿查某個header file是否真的有被included, 有個方法可以很簡單的做到檢查
就是透過 在檔案裡面加入 #warning "MESSAGE"的方式 讓compiler在編譯的時候顯示出該行MESSAGE


查看GCC幫你加了什麼東西來編譯檔案

舉例來說 如果你原本的編譯指令為

/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/msdk-linux-gcc -I.. -I../.. -I../../include -O -DOPENSSL_THREADS -pthread -D_REENTRANT -D_THREAD_SAFE -D_THREADSAFE  -fPIC   -c -o bss_dgram.o bss_dgram.c

如果編譯過程遇到一些問題而想查看到底gcc幫你加了什麼來編譯該檔案
可以在同樣的指令後面再加上
 -E -v
如:
/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/msdk-linux-gcc -I.. -I../.. -I../../include -O -DOPENSSL_THREADS -pthread -D_REENTRANT -D_THREAD_SAFE -D_THREADSAFE  -fPIC   -c -o bss_dgram.o bss_dgram.c -E -v

如此就不會真的去編譯檔案 而是列出gcc 的一些設定與參考路徑, 以上面例子在我自己的pc上為例, 會看到


Using built-in specs.
Target: mips-linux
Configured with: MSDK Builder release 4.3
Thread model: posix
gcc version 4.3.6 20110218 (prerelease) (GCC)
COLLECT_GCC_OPTIONS='-nostdinc' '-isystem' '/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/include' '-idirafter' '/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/include/gcc' '-mhard-float' '-EL' '-mips32r2' '-I..' '-I../..' '-I../../include' '-O' '-DOPENSSL_THREADS' '-pthread' '-D_REENTRANT' '-D_THREAD_SAFE' '-D_THREADSAFE' '-fPIC' '-c' '-o' 'bss_dgram.o' '-E' '-v' '-mllsc'
 /usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/../libexec/gcc/mips-linux/4.3.6/cc1 -E -quiet -nostdinc -v -I.. -I../.. -I../../include -imultilib el -iprefix /usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/../lib/gcc/mips-linux/4.3.6/ -D_REENTRANT -DOPENSSL_THREADS -D_REENTRANT -D_THREAD_SAFE -D_THREADSAFE -isystem /usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/include -idirafter /usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/include/gcc bss_dgram.c -o bss_dgram.o -mel -mhard-float -mips32r2 -mllsc -fPIC -O
#include "..." search starts here:
#include <...> search starts here:
 ..
 ../..
 ../../include
 /usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/include
 /usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/include/gcc
End of search list.
COMPILER_PATH=/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/../libexec/gcc/mips-linux/4.3.6/:/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/../libexec/gcc/:/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/../lib/gcc/mips-linux/4.3.6/../../../../mips-linux/bin/
LIBRARY_PATH=/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/../lib/gcc/mips-linux/4.3.6/el/:/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/../lib/gcc/mips-linux/4.3.6/:/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/../lib/gcc/:/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/bin/../lib/gcc/mips-linux/4.3.6/../../../../mips-linux/lib/
COLLECT_GCC_OPTIONS='-nostdinc' '-isystem' '/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/include' '-idirafter' '/usr/local/msdk-4.3.6-mips-EL-2.6.34-0.9.30.3_hwfpu/include/gcc' '-mhard-float' '-EL' '-mips32r2' '-I..' '-I../..' '-I../../include' '-O' '-DOPENSSL_THREADS' '-pthread' '-D_REENTRANT' '-D_THREAD_SAFE' '-D_THREADSAFE' '-fPIC' '-c' '-o' 'bss_dgram.o' '-E' '-v' '-mllsc'




2013年1月28日 星期一

remove all .svn folders

當拿到一整包source code 但不想要有保留裡面的.svn folders的話
可以用以下command 把folder裡面(包含所有sub-folders)的.svn folder通通delete
find /path/to/target/folder -type d -name '.svn' -exec rm -rf {} \;

2013年1月18日 星期五

不知道從哪時候開始, 想要用更新家裡電腦中的android source, 打repo sync後都一直出現下面這個錯誤訊息


error: Failed to connect to 2404:6800:4008:c01::52: Network is unreachable while accessing https://android.googlesource.com/platform/manifest/info/refs
fatal: HTTP request failed

就算重新repo init 一包也一樣有類似的錯誤 遲遲無法獲得最新的source code
我都懷疑難道是中華電信ipv6的機制太差還是怎樣

最後終於就在剛剛, 找到解答了
原來一切都是proxy搞得鬼
在設定好proxy後 就可以開開心心repo sync了

方法很簡單
export HTTP_PROXY=http://proxy.hinet.net:80
export HTTPS_PROXY=http://proxy.hinet.net:80



2013年1月15日 星期二

Add new internal resource in Android Jelly Bean

依據之前的經驗, 只要將新增的xml (string or icon, id)放到Android source 對應的res folder裡面之後在編譯Android 時就會自動加入到內部生成的R.java

但最近在porting Android JB時發現新增加的internal resource 並沒有被自動生成, 導致編譯時會發生 cannot find symbol的問題如下

cannot find symbol
symbol  : variable xxxxx
location: class com.android.internal.R.(...)

Google了一下後找到解決方法了, 但是不曉得這到底是不是JB的新機制(很不方便XD)

在 frameworks/base/core/res/MakeJavaSymbols.sed 裡有註明


# Run this on the errors output by javac of missing resource symbols,
# to generate the set of commands to have aapt generate
# the symbol for them.
#
# For example: make framework 2>&1 | sed -n -f MakeJavaSymbols.sed | sort -u

於是我在Android source tree的 root folder下打

$ make framework 2>&1 | sed -n -f frameworks/base/core/res/MakeJavaSymbols.sed | sort -u

執行完後就會產生
< java-symbol type="string" name="xxxxx" / >

把產生出來的這些內容直接貼到
frameworks/base/core/res/res/values/public.xml
就可以了

再來就照編譯Android 的方法來編譯就好了


Ref: http://www.cppblog.com/wythern/archive/2012/12/21/191394.html


2013年1月9日 星期三

[eclipse] failed to launch eclipse on ubuntu 12.04

由於ubuntu的default JDK是Open JDK, 但由於要編譯Android 的關係, 我把JDK換成了Oracle JDK, 而導致安裝好Eclipse後 在啟動Eclipse會失敗, 失敗訊息如下

java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:

no swt-gtk-3740 in java.library.path

no swt-gtk in java.library.path

Can't load library: /home/hamersun/.swt/lib/linux/x86_64/libswt-gtk-3740.so

Can't load library: /home/hamersun/.swt/lib/linux/x86_64/libswt-gtk.so





解決方法是

on 64-bit
ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86_64/
on 32-bit
ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86/