Calendar

八月 2011
« 四月   十二月 »
1234567
891011121314
15161718192021
22232425262728
293031  

Categories

用 gcc-4.3+ 編 graphics/graphviz 遇到 libgvc.so: undefined reference to `sincos' 錯誤時的解法

錯誤訊息:

gmake[3]: Entering directory /usr/ports/graphics/graphviz/work/graphviz-2.28.0/cmd/dot' CC dot-dot.o CC dot-no_builtins.o CC dot_builtins-dot.o CC dot_builtins-dot_builtins.o CCLD dot_builtins CCLD dot ../../lib/gvc/.libs/libgvc.so: undefined reference to sincos'
collect2: ld returned 1 exit status
gmake[3]: *** [dot] Error 1

FreeBSD 的 libm 裡目前還沒有實作 sincos 這個函式。
autoconf 產生出的 configure script 測出來會說有,是因為它的測試參數下得跟實際編譯時不一樣,會用到 GCC 的 built-in function。
這個老外已經有說解法了:
http://markmail.org/thread/okslhtdmwckdweed#query:+page:1+mid:okslhtdmwckdweed+state:results
就是跑完 configure 之後直接把測試結果 edit 掉。
在 FreeBSD 要做這種事很簡單,在 Makefile 的 post-configure 加點料就可以搞定:

  • 應該修正 configure (修改 configure 到可以正確偵測),或是直接拔掉 HAVE_SINCOS 整段 code...

    怎麼會去改 config.h,我記得 Porter's Handbook 有提過要避免?

    • 對,所以這個感覺沒可能被 maintainer 接受。
      我想這也是為什麼那篇出現到現在,這東西還是壞掉的原因。
      那只是頭痛醫頭,腳痛醫腳的做法;但對於只想把它裝起來的 user 來說,或許這是最快速的方案。
      正式的解決方案,我想還是要去動 configure.ac 或 configure,讓測試的參數跟編譯時一致,或是加上 -fno-builtins。
      這樣才能正確檢測出 libm 裡有沒有 sincos 這函式。