2013-05-16 4 views
5

Например я пытаюсь использовать GLFW3 и выдает следующее сообщение об ошибке на меняКак связать неизвестную библиотеку

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

Я только знаю, что у него есть что-то делать с X11, но как я знаю, какая библиотека Мне нужно связать? Как бы вы справились с этой проблемой?

+7

Я бы напечатал 'XIQueryVersion' в Google. –

+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, чтобы увидеть, если они скажут вам, которые Lib связать, чтобы получить эту функцию
  2. взгляд на веб, если вы можете найти ссылку на эту библиотеку
  3. использование nm на LIBS X11, чтобы увидеть, какой из них содержит эту ссылку

(shhhhhh ... это 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 связывающих флагов для требуемой связывающей LIBS, это мне потребовалось некоторое время, чтобы сделать это. Требуемый внешние LIBS, чтобы скомпилировать программу на основе glfw, являются:

Requires.private: x11 xrandr xi xxf86vm gl 

This нити показывает, как найти эту LIBS, необходимую для компиляции программы на основе glfw.

Так как я потратил 2-3 часа на поиск флагов Cmake для вышеупомянутых дополнительных ссылок libs. Я думаю, что стоит упомянуть здесь, чтобы помочь другим.

Главным образом для ошибки, о которой я упомянул выше, мне нужен был только флаг связи 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. Надеюсь, это сэкономит время другим. Наслаждайтесь!

Смежные вопросы