2014-09-12

DYLD_LIBRARY_PATH in mac osx

在Mac上執行Python程式時,有時候會import shared library,而這個shared library可能又link到另一個shared library。如果這三個都是自己build的,在執行上很可能會遇到一個錯誤:

ImportError: dlopen(...): Library not loaded: share2.so
  Referenced from: share1.so
  Reason: image not found

程式架構是這樣的:myPython.py -> share1.so -> share2.so。會出現這個錯誤的原因是,系統不知道去哪裡找share2.so。解決這個問題的方法就是告訴系統去哪裡找自己build出來的share library:

export DYLD_LIBRARY_PATH=/path/to/your/share/library

[1] https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dyld.1.html

Pattern rule in Makefile

最近看到一個Makefile的寫法如下:

.cpp.o: dummy
$(CXX) $(CFLAGS) -c $(SDLFLAGS) $(INCLUDE) $< -o $@

剛開始還找不到每個.cpp編譯的target,後來才發現應該是這個target。

在Makefile裡可以使用pattern rule,'%'代表的是nonempty substring,所以'%.cpp'代表的是所有結尾是'.cpp'的檔案。因此target可以寫成'%.o: %.cpp',這代表任一個'.o'的target,其dependency為同名的'.cpp',例如'abc.o: abc.cpp''test.o: test.cpp'

上面程式碼中的寫法'.cpp.o'等同'%.o: %.cpp',只是使用suffix rule來表示。因為'.cpp''.o'為Makefile認得的檔案,因此可以用suffix rule來表示。

至於'$<''$@'則為automatic variable。'$@'表示target的檔案名稱,而'$<'表示第一個dependency的檔案名稱。

如此一來這個target總算解析完成,Makefile真是博大精深。

Reference
[1] HowTo Write Generic Makefiles
[2] Defining and Redefining Pattern Rules
[3] Old-Fashioned Suffix Rules


2014-09-01

Sublime Text 3

Download site: http://www.sublimetext.com
Settings:
{
    "font_size": 14,
    "translate_tabs_to_spaces": true,
    "highlight_line": true,
    "draw_white_space": "all",
    "trim_trailing_white_space_on_save": true,
    "ensure_newline_at_eof_on_save": true,
    "highlight_modified_tabs": true,
    "bold_folder_labels": true,
    "word_wrap": true
}

Package Control: https://sublime.wbond.net
Packages:
SideBarEnhancemts
SublimeLinter
SublimeCodeIntel
BracketHighlighter
SublimeREPL
All Autocomplete