我正在使用以下make文件构建一个链接libbson和libmongoc的应用程序:
CURRENT_DIR=$(shell pwd)
INC=-I/usr/local/include/libbson-1.0
INC+=-I/usr/local/include/libbson-1.0/bson
INC+=-I/usr/local/include/libmongoc-1.0/mongoc
INC+=-I$(CURRENT_DIR)/thpool
INC+=-I$(CURRENT_DIR)/cJSON
LIBS=/usr/local/lib/
all : request.o db_manager.o main.o
+$(MAKE) -C cJSON all
+$(MAKE) -C thpool all
mkdir build
mv cJSON/*.o build/
mv thpool/*.o build/
mv request.o build/
mv db_manager.o build/
mv main.o build/
cp -R libs build/ #make copy of local static libs
cd build && \
cc $(INC) -w -pthread main.o request.o db_manager.o cJSON.o cJSON_Utils.o \
thpool.o $(LIBS)libbson-1.0.so $(LIBS)libmongoc-1.0.so \
-o ghost-chat
request.o : request.c
cc -w $(INC) -c request.c
db_manager.o : db_manager.c
cc -w $(INC) -c db_manager.c
main.o : main.c
cc -w $(INC) -c main.c
clean :
rm -rf build
应用程序生成正确,但在执行期间,当我调用libmongoc函数时,它返回以下错误:
./build/ghost-chat: symbol lookup error: ./build/ghost-chat: undefined symbol: mongoc_collection_insert_one
我是否正确链接libmongoc-1.0.so库?我已经用最新的tarball构建了libmongoc驱动程序,因此安装目录是/usr/local/*。我已经成功地测试了这个应用程序——在macOS上使用Xcode,使用它自己的构建系统,但是我已经编写了这个make文件,允许在我们的*Nix服务器上构建。
任何建议都将不胜感激。
最佳答案
我已经用最新的tarball构建了libmongoc驱动程序,因此安装目录是/usr/local/*
标准系统目录(libmongoc-1.0.so
或系统的默认目录)中是否也有/usr/lib
?
如果是这样,那么您可能在运行时加载了错误的libmongoc-1.0.so
(而该系统版本缺少mongoc_collection_insert_one
符号)。
运行ldd ./build/ghost-chat
应该显示运行时加载器找到的libmongoc
,在该版本上运行nm -D libmongoc-1.0.so | grep mongoc_collection_insert_one
应该确认未定义符号。
您要做的是将二进制文件与-Wl,-rpath=$(LIBS)
链接,以便在/usr/local/lib
之前搜索/usr/lib
。
关于c - 动态链接C驱动程序后的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52771186/