2013-05-16 15 views
5

Na przykład próbuję użyć GLFW3 i zgłasza następujący błąd na mnieJak połączyć nieznaną bibliotekę

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

Wiem tylko, że to ma coś wspólnego z X11, ale skąd mam wiedzieć, które biblioteki Muszę połączyć? Jak poradziłbyś sobie z tym problemem?

+7

Wpisałbym "XIQueryVersion" w Google. –

+1

Fora, dokumentacja, Google, Wiki;) – gaussblurinc

Odpowiedz

5

Można użyć nm do listy symboli zdefiniowanych w bibliotekach systemu w celu znalezienia których jedna zawiera swój brakujący symbol:

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

które wyjścia:

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

Wtedy wiesz, że musisz połączyć libXi.a, oczywiście możesz dostosować ścieżkę do biblioteki i nazwę symbolu, która będzie działać tylko wtedy, gdy masz już odpowiednią bibliotekę w swoim systemie .

5

chciałbym postępować w następującej kolejności:

  1. wygląd w dok X11 aby sprawdzić, czy powiedzieć, które lib połączyć, aby uzyskać tę funkcję
  2. spojrzenie na internecie jeśli możesz znaleźć odniesienie do niniejszej lib
  3. użytku nm na bibliotekami X11, aby zobaczyć, który zawiera ten odniesienie

(shhhhhh ... to libxi)

+0

Okay teraz też to znalazłem. Myślałem tylko, że będzie szybszy sposób. Dziękuję Ci. –

1

Otrzymywałem podobne błędy linkowania. Mój błąd był mówiąc:

/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' 

Ale ponieważ chciałem CUpewnij flagi linkami z wymaganymi bibliotekami łączących, zajęło mi trochę czasu, aby to zrobić. Wymagane bibliotekami zewnętrznymi, aby skompilować program oparty glfw są:

Requires.private: x11 xrandr xi xxf86vm gl 

This wątek pokazuje, jak znaleźć te bibliotekami potrzebne do kompilacji program oparty glfw.

Odtąd spędziłem 2-3 godziny szukając flag łączących Cmake dla powyższych dodatkowych bibliotek łączących. Myślę, że warto tutaj wspomnieć o pomaganiu innym.

Głównie za błąd, o którym wspomniałem powyżej, potrzebowałem tylko flagi łączenia cmake dla xi, ale dla kompletności wzmiankuję dla nich wszystkich, tj. x11 xrandr xi xxf86vm. Oto urywek z mojego pliku 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} 
    ) 

Ja wybiłem te flagi z tego link. Mam nadzieję, że zaoszczędzi to trochę czasu dla innych. Cieszyć się!

Powiązane problemy