Что может быть причиной ошибок компоновки при компиляции в Alpine Docker? - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь скомпилировать программу в Docker-контейнере, созданном из базового образа Alpine 3.7. Программа использует argp.h и включает его как #include <argp.h>. Я установил argp-standalone и убедился, что он делает это на образ. Файл argp.h находится в usr/include, однако, когда я компилирую свою программу, используя следующие команды:

gcc -W -Wall -Wextra -I/usr/include   -c -o progname.o progname.c
gcc -largp -o progname progname.o

Я получаю следующую ошибку:

progname.o: In function `parse_opt':
progname.c:(.text+0x4c9): undefined reference to `argp_failure'
progname.c:(.text+0x50f): undefined reference to `argp_failure'
progname.c:(.text+0x555): undefined reference to `argp_failure'
progname.c:(.text+0x59b): undefined reference to `argp_failure'
progname.c:(.text+0x5ce): undefined reference to `argp_error'
progname.c:(.text+0x5f4): undefined reference to `argp_error'
progname.o: In function `main':
progname.c:(.text+0x1397): undefined reference to `argp_parse'
collect2: error: ld returned 1 exit status
make: *** [Makefile:9: progname] Error 1

У меня есть:

  • Гарантировал, что версия argp.h, которая находится на изображении, действительно включает функции argp_failure, argp_parse и argp_error.
  • Пробное перемещение argp.h в разные места на машине (например, в тот же каталог, где выполняется компиляция, в /usr/lib)
  • Пробная компиляция с -l и -L.

Соответствующие пакеты, также установленные в образе: build-base, make и gcc. При компиляции образа Ubuntu эти же команды работают нормально, даже без флагов -largp и -I/usr/include. Что могло бы происходить по-другому в альпийском изображении, которое могло бы заставить это не работать?

Редактировать

Согласно комментарию @ Пабло, я 'm теперь компилирует его следующим образом:

gcc -W -Wall -Wextra -I/usr/include -L/usr/lib -c -o progname.o progname.c
gcc -largp -o progname progname.o

Убедившись, что статическая библиотека libargp.a расположена в /usr/lib. Однако та же проблема все еще сохраняется.

Редактировать 2

Компиляция следующим образом (и снова в соответствии с предложением @ Pablo) устранила ошибку, которая у меня была:

gcc -W -Wall -Wextra -I/usr/include -L/usr/lib -c -o progname.o progname. C
gcc -o progname progname.o /usr/lib/libargp.a

Однако мне все еще любопытно, почему при использовании точно такой же библиотеки и инструкций это не удастся скомпилировать в образе Alpine при компиляции без проблем в образе Ubuntu.

...