由于某种原因,我无法将 so 文件动态链接到在 Alpine 容器中使用 clang 构建的最小 C 应用程序 - 在我的 Archlinux 上构建时,它可以工作。
该应用程序如下所示,它只是调用共享库中的随机函数。我也尝试过其他库,结果相同。
main.c
#include <jansson.h>
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
// call a random function from a shared lib
json_object();
return 0;
}
我有一个非常基本的 Makefile:
CC = clang
CFLAGS = -Wall -Wextra -O2
DEPS = $(wildcard *.h)
SRC = $(wildcard *.c)
OBJ = $(SRC:.c=.o)
TARGET = app
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
$(TARGET): $(OBJ)
$(CC) -v -L /usr/lib -ljansson -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm -f $(OBJ) $(TARGET)
我使用以下命令启动 Docker 容器并安装所需的软件包:
docker run --rm -it -v $PWD:/work -w /work alpine
apk update
apk add clang make jansson-dev
最后,我会尝试构建,但失败了,如下所示:
/work # make
clang -c -o main.o main.c -Wall -Wextra -O2
clang -v -L /usr/lib -ljansson -o app main.o -Wall -Wextra -O2
Alpine clang version 17.0.5
Target: x86_64-alpine-linux-musl
Thread model: posix
InstalledDir: /usr/bin
Configuration file: /etc/clang17/x86_64-alpine-linux-musl.cfg
System configuration file directory: /etc/clang17
Found candidate GCC installation:
/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1 Selected GCC installation:
/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1 Candidate multilib: .;@m64
Selected multilib: .;@m64
"/usr/bin/ld" -pie -z now -z relro --hash-style=gnu --build-id --eh-frame-hdr
-m elf_x86_64 -dynamic-linker /lib/ld-musl-x86_64.so.1 -o app /usr/lib/Scrt1.o
/usr/lib/crti.o /usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1/crtbeginS.o
-L/usr/lib -L/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1
-L/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1/../../../../x86_64-alpine-linux-musl/lib
-L/lib -L/usr/lib --as-needed -ljansson main.o -lssp_nonshared -lgcc --as-needed
-lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1/crtendS.o /usr/lib/crtn.o
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0xe): undefined reference to `json_object'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:12: app] Error 1
为了确定,so 文件就是我所期望的。
/work # ls /usr/lib/libjansson*
/usr/lib/libjansson.so /usr/lib/libjansson.so.4 /usr/lib/libjansson.so.4.14.0
如果我在 Archlinux 或 Ubuntu 容器中执行相同的操作,它会按预期工作。
我错过了什么?
我错过了什么?
您的链接命令是错误的:库应该follow引用它们的对象。将
-ljansson
移动到链接线上的 $^
之后。