我正在使用以下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/

10-12 07:21