【发布时间】:2019-11-09 01:28:53
【问题描述】:
我正在尝试在从 Alpine 3.7 基础映像构建的 docker 容器中编译一个程序。该程序使用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 标志,这些相同的命令也可以正常工作。 在 Alpine 图像中可能会发生什么不同的情况而导致此功能不起作用?
编辑
根据@Pablo 的评论,我现在将其编译如下:
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
但是,我仍然很好奇,为什么在使用完全相同的库和指令时,在 Ubuntu 映像中编译时会无法在 Alpine 映像中编译。
【问题讨论】:
-
链接时头文件无关。您需要共享库 (
.so) 或静态库 (.a)。假设是共享库,需要找到libargp.so的存放位置,并以-L传递目录的路径。如果您没有这两个文件(libargp.so或libargp.a),则无法链接到-largp。 -
好的,谢谢@Pablo 的回复。静态库
libargp.a位于/usr/lib,但是在使用-L标志传递此目录后问题仍然存在。 -
如果这是一个静态库,尝试像这样链接:
gcc -o progname progname.o /usr/lib/libargp.a