Я пытаюсь скомпилировать программу в 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.