ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2009年9月8日 星期二

GCC - library link order

http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html 2.7.1 Link order of libraries linker 尋找 extern function 的搜尋順序是 follow command 的指示,依次從左到右。 所以在指定 -l 外部 library 時,順序很重要:
$ gcc -Wall calc.c -lm -o calc   (correct order)
With some linkers the opposite ordering (placing the -lm option before the file which uses it) would result in an error,
$ cc -Wall -lm calc.c -o calc    (incorrect order)
main.o: In function `main':
main.o(.text+0xf): undefined reference to `sqrt'
因為command 的order,calc.c 後面沒有寫明任何 library,calc.c 使用到的sqrt 雖然有定義在 libm ,但是command 列在calc.c 之前,所以 linker 找不到。 When several libraries are being used, the same convention should be followed for the libraries themselves. A library which calls an external function defined in another library should appear before the library containing the function. 例如, data.c 使用到 linear programming library : library,library 又使用到 math library : libm。所以正確的linking order 是:
$ gcc -Wall data.c -lglpk -lm
since the object files in ‘libglpk.a’ use functions defined in ‘libm.a’. 目前大多數的 linker 都會(重複?)搜尋所有指定的 external library,所以 linking order 在目前似乎沒那麼重要。 但是當你在build 時遇到 undefined external,而你又確定該 symbol 是有定義的,或許試試是不是 linking order 的問題。
還有另一個問題是重複的function,如果一個function 在兩個 external libary 都有定義,linker 會採用 linking order 在前面的那個 libary (依照找到的順序)。

沒有留言:

標籤

網誌存檔