链接静态 C 库时未定义的引用
Undefined reference while linking static C library
在我最近的项目中,我遇到了一个关于对共享库方法的未定义引用的奇怪问题。我在 SO 上进行了搜索,但我只能找到与 C++ 相关的内容(extern "C")或没有真正帮助。
有问题的库是 my fork of libosm,它使用 protobuf 以二进制格式 (.osm.pbf) 为 OpenStreetMap 数据生成 de-/serialization 代码。有问题的功能是 osmpbf__blob__unpack
但这只是我最终使用的第一个功能,所以我怀疑它是一个普遍问题。
我用 nm
检查了生成的 libosm.a
并且该方法在那里并已导出,但由于某种原因在链接时找不到它。以下是我当前的标志。我尝试更改顺序,甚至两次包含所有库(如另一个线程中所建议的那样),但我总是以未定义的引用结束。
CFLAGS = -v -std=c99 -O3 -Wall -Wextra -pedantic
LIBFLAGS = -losmpbf -lprotobuf-c -lz -lpthread
目前我完全不知道错误是什么,但我认为这可能是一个小的一般性错误。好久没用C了。。
任何帮助将不胜感激。
干杯,
弗洛里安
编辑:这是我的完整 Makefile。我只是为变量 LIBFLAGS
命名,因为我使用了自己的小规则,但似乎我应该使用 LDLIBS
和这个简单案例的内置规则。
CC = gcc
CFLAGS = -v -std=c99 -O3 -Wall -Wextra -pedantic
LIBFLAGS = -losmpbf -lprotobuf-c -lz -lpthread
all: main.x
main.x: main.c
$(CC) $(CFLAGS) $(LIBFLAGS) main.c -o main.x
clean:
rm -rf *.o main.x
问题是 linker (gcc) 和大多数 linker 一样,从左到右处理参数。所以 link 看到了库,但是没有要处理的未解析引用,所以什么也没有发生。
解决方法是将库放在行的最后,而不是紧跟在 CFLAGS 之后。
在我最近的项目中,我遇到了一个关于对共享库方法的未定义引用的奇怪问题。我在 SO 上进行了搜索,但我只能找到与 C++ 相关的内容(extern "C")或没有真正帮助。
有问题的库是 my fork of libosm,它使用 protobuf 以二进制格式 (.osm.pbf) 为 OpenStreetMap 数据生成 de-/serialization 代码。有问题的功能是 osmpbf__blob__unpack
但这只是我最终使用的第一个功能,所以我怀疑它是一个普遍问题。
我用 nm
检查了生成的 libosm.a
并且该方法在那里并已导出,但由于某种原因在链接时找不到它。以下是我当前的标志。我尝试更改顺序,甚至两次包含所有库(如另一个线程中所建议的那样),但我总是以未定义的引用结束。
CFLAGS = -v -std=c99 -O3 -Wall -Wextra -pedantic
LIBFLAGS = -losmpbf -lprotobuf-c -lz -lpthread
目前我完全不知道错误是什么,但我认为这可能是一个小的一般性错误。好久没用C了。。 任何帮助将不胜感激。
干杯, 弗洛里安
编辑:这是我的完整 Makefile。我只是为变量 LIBFLAGS
命名,因为我使用了自己的小规则,但似乎我应该使用 LDLIBS
和这个简单案例的内置规则。
CC = gcc
CFLAGS = -v -std=c99 -O3 -Wall -Wextra -pedantic
LIBFLAGS = -losmpbf -lprotobuf-c -lz -lpthread
all: main.x
main.x: main.c
$(CC) $(CFLAGS) $(LIBFLAGS) main.c -o main.x
clean:
rm -rf *.o main.x
问题是 linker (gcc) 和大多数 linker 一样,从左到右处理参数。所以 link 看到了库,但是没有要处理的未解析引用,所以什么也没有发生。
解决方法是将库放在行的最后,而不是紧跟在 CFLAGS 之后。