Как я могу узнать, какие флаги компоновщика необходимы для использования данной функции библиотеки C?

Запуск примера C-кода – это болезненное упражнение, если оно не связано с make-файлом.

Я часто нахожусь в файле C, содержащем код, который, предположительно, делает что-то очень классное, но для которого первая основная попытка компиляции ( gcc main.c )

 main.c:(.text+0x1f): undefined reference to `XListInputDevices' clang-3.7: error: linker command failed with exit code 1 (use -v to see invocation) 

-или похожие.

Я знаю, это означает, что мне не хватает правильных флагов компоновщика, таких как -lX11 , -lXext или -lpthread .

Но какие?


То, как я в настоящее время занимаюсь этим, – найти заголовок библиотеки, из которого была включена функция , использовать поиск Github для поиска другой программы, которая импортирует тот же заголовок, открыть его make-файл, найти флаги компоновщика, скопировать их в мою команду компиляции, и удаляйте флаги, пока не найду минимальный набор, который все еще компилируется.

Это неэффективно, скучно и заставляет меня чувствовать, что должен быть лучший способ.

    2 Solutions collect form web for “Как я могу узнать, какие флаги компоновщика необходимы для использования данной функции библиотеки C?”

    Вопрос заключается в том, как определить, какой флаг компоновщика использовать из проверки исходного файла. Пример ниже будет работать для Debian. Заголовочные файлы являются соответствующими элементами, которые нужно отметить здесь.

    Итак, предположим, что у одного есть исходный файл C, содержащий заголовок

     #include <X11/extensions/XInput.h>. 

    Мы можем выполнить поиск XInput.h используя, скажем, apt-file . Если вы знаете, что этот заголовочный файл содержится в установленном пакете, то также будет работать dpkg -S или dlocate . Например

     apt-file search XInput.h libxi-dev: /usr/include/X11/extensions/XInput.h 

    Это говорит о том, что этот заголовочный файл принадлежит пакету разработки для libxi (для библиотек C в пакеты разработки (обычно с формой libname-dev или libname-devel ) содержатся файлы заголовков), и поэтому вы должны использовать -lxi компоновщик флаг.

    Подобные методы должны работать для любого распространения с системой управления пакетами.

    Вот вики сообщества, чтобы собрать другие эквивалентные инструменты дистрибутива для метода Фахема . Не стесняйтесь редактировать, но сохраните сортировку по алфавиту для поиска.

    арочный

    Используйте pkgfile из extra репозитория, передав имя файла заголовка в качестве параметра.

    Пример:

     $ pkgfile XInput.h extra/libxi extra/nx-headers 

    Debian

    (и все, что Debian основано на использовании dpkg )

    apt-file search имени заголовка, как описано .

    Gentoo

    Как описано в другом вопросе warl0ck , используйте программу e-file пакета pfl или, альтернативно, веб-интерфейс поиска файлов Portage .

    Linux и Unix - лучшая ОС в мире.