2013-05-16 28 views
5

比如我想使用GLFW3,它在我拋出以下錯誤如何鏈接一個未知的庫

x11_init.c:-1: error: undefined reference to `XIQueryVersion'.

我只知道它有事情做與X11,但我怎麼知道哪個庫我必須鏈接?你將如何解決這個問題?

+7

我會在Google中輸入'XIQueryVersion'。 –

+1

論壇,文檔,Google,Wiki;) – gaussblurinc

回答

5

你可以使用nm列出,以便在系統庫定義的符號找到哪一個包含你丟失的符號:

find /usr/lib/ -type f -name \*.a \ 
    -exec nm -gAC --defined-only {} 2> /dev/null \; \ 
    | grep \ XIQueryVersion 

,輸出:

/usr/lib/x86_64-linux-gnu/libXi.a:XIQueryVersion.o:00000110 T XIQueryVersion 

然後你知道你必須鏈接libXi.a,當然你可以調整庫路徑和符號名稱,只有當你的系統中已經有正確的庫。

5

我會按以下順序進行:

  1. 看在X11文檔,看看他們告訴你的鏈接以獲取該功能
  2. 的樣子網絡上如果可以的話,其LIB發現在X11庫的引用,這個LIB
  3. 使用nm,看看哪一個包含此參考

(噓......這是libxi

+0

好吧,現在我也找到了。我只認爲會有更快的方法。謝謝。 –

1

我得到類似的鏈接錯誤。我的錯誤是說:

/usr/local/lib/libglfw3.a(x11_init.c.o): In function `initExtensions': 
x11_init.c:(.text+0x16d3): undefined reference to `XIQueryVersion' 
/usr/local/lib/libglfw3.a(x11_window.c.o): In function `createWindow': 
x11_window.c:(.text+0x6de): undefined reference to `XISelectEvents' 

但因爲我想CMake的鏈接標誌爲所需的鏈接庫,我花了一段時間來做到這一點。需要外部庫,編譯基於GLFW程序,分別是:

Requires.private: x11 xrandr xi xxf86vm gl 

This線程將展示如何找到這些庫編譯基於GLFW程序所需。

因爲我花了2-3個小時尋找上述附加鏈接庫的Cmake鏈接標誌。我認爲這裏值得一提的是幫助別人。

主要是針對上面提到的錯誤,我只需要一個cmake鏈接標誌爲xi而已,但爲了完整起見,我提到了所有這些標誌,即x11 xrandr xi xxf86vm。下面是摘錄從我CMakeLists.txt文件:

include_directories(
    ./src 
    ${X11_xf86vmode_INCLUDE_PATH} 
    ${X11_Xrandr_INCLUDE_PATH} 
    ${X11_Xinput_INCLUDE_PATH} 
) 

    target_link_libraries(
     ${GLFW_LIBRARIES} 
     ${X11_LIBRARIES} 
     ${X11_Xxf86vm_LIB} 
     ${X11_Xrandr_LIB} 
     ${X11_Xinput_LIB} 
    ) 

我提取這些標誌從這個link。 希望,這將節省時間等。請享用!

相關問題