$ 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 -lmsince 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 (依照找到的順序)。
沒有留言:
張貼留言