標籤

C++ (12) Linux (6) MacOSX (4) Makefile (3) Matlab (3) Ubuntu (3) Android (2) C (1) Refactoring (1)

2013年3月15日 星期五

[Makefile] Rules & Implicit Rules

%.o : %.cpp
        $(CC) -o ...

這種寫法只有"當前目錄下"的.o檔才會使用這條rule
如果要把*.o放到obj/下的話
就得寫成
obj/%.o: %.cpp
        $(CC) -o ...
這樣才找得到

另外可以在terminal下輸入make -p
來看到整個make的流程

[Makefile] add dependency

target1: d1
        $(CC) -o ....

target1: d2 d3
target1: d4 d5

這樣寫的話
後面兩個都沒有實際執行任何東西
所以第一行會被解讀成
target1: d1 d2 d3 d4 d5

2013年3月14日 星期四

[Makefile] CFLAGS & CPPFLAGS

轉自 http://stackoverflow.com/questions/2754966/cflags-vs-cppflags
其他參考資料 http://wiki.ubuntu.org.cn/index.php?title=%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D&variant=zh-hant
http://www.makelinux.net/make3/make3-CHP-2-SECT-7

Makefile 在沒有pattern rules時
會自動使用內建的implicit rules去compile *.c 和 *.cpp


%.o:%.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<


%.o:%.cpp
    $(CC) $(CPPFLAGS) -c -o $@ $<

CPPFLAGS 和 CFLAGS 的差別在於
如果檔案是*.cpp的形式
內建的implicit rule並不會去使用到CFLAGS
只會用到CPPFLAGS
所以如果把 -g -w -I include/這些東西放到CFLAGS的話
是沒有用的

2013年2月4日 星期一

[NAT Loopback] Buffalo WHR-G300N 並不支援 NAT Loopback

狀況是這樣的
我想把固定ip的某個port轉發(port forwarding)到LAN裡的某台桌機的port 22
這樣我就可以人在外面時
依然可以ssh遠端到我的桌機

登入192.168.11.1到Buffalo WHR-G300N
設定完Port Forwarding後
想說就當場說試試看可不可以用啦
總不能跑到外面試發現有問題在回家重設吧

接著我就ssh boton@140.x.x.x
得到的回應是
ssh: connect to host 140.x.x.x port 22: Connection refused

WTF...

阿不是設定port forwarding了嗎 到底哪裡有問題
找了許久也找不到有哪裡設定還要打開或調整之類的

後來google了一下才發現原來只有在LAN裡面不能這樣玩
到外面的網路就ok
當下心想這什麼妖術!!

原來是這台AP不支援NAT Loopback...

http://support.hornington.com/kb/question.php?ID=345
http://security.stackexchange.com/questions/16343/is-nat-loopback-on-my-router-a-security-problem

2013年2月2日 星期六

[Matlab] 在Linux下安裝Matlab並在Mac OS上遠端執行(X11 Forwarding)

Linux下安裝其實滿容易的
先將安裝檔 matlab_2012a_unix.iso 掛載起來:
sudo mkdir /mnt/temp
sudo mount -o loop path_to_matlab_iso/matlab_2012a_unix.iso /mnt/temp

接著切換目錄到剛掛載完的資料夾
cd /mnt/temp

再來就是安裝啦!
sh ./install

接著就會啟動MATLAB安裝導引程式

安裝完後可以用ln -s 將安裝完的matlab資料夾下的bin下的matlab連結到/usr/bin/
以方便使用
執行時若遇到

/lib64/libc.so.6: not found

這個問題
只要下 ln -s /lib/x86_64-linux-gnu/libc.so.6 /lib64/libc.so.6  即可輕鬆搞定

若是遇到
what():  locale::facet::_S_create_c_locale name not valid 程式中止
用echo $LANG檢查一下你的環境變數$LANG
透過export LANG='en_US.utf8'修改$LANG後
重新執行matlab應該就可以開啟囉

======================================================
要遠端執行Matlab並在近端看到圖形視窗也不難
首先要檢查有灌Matlab那台遠端主機的兩個檔案
/etc/ssh/ssh_config
(將這三行註解拿掉改成yes)
 20    ForwardAgent yes
 21    ForwardX11 yes
 22    ForwardX11Trusted yes

/etc/ssh/sshd_config
(將X11Forwarding打開)
X11Forwarding yes

接著重新啟動sshd
sudo ssh restart 
(若不行則用sudo service ssh restart)

到目前為止遠端主機已經設定完了


近端電腦我選用的是Mac OS X Mountain Lion
要注意的是Mountain Lion並不像Snow Leopard或其他較早版本
有內建X11

簡單google一下就會發現Apple提供了另一支程式XQuartz
並建議你使用他
http://support.apple.com/kb/HT5293

安裝完X11後
開啟Terminal執行ssh my_id@host.ip -X
記得後面要加-X這個選項 代表要開啟X11Forwarding
(在Mac OS X中則是以-Y代替-X)

接著就可以在ssh中執行matlab啦