Неопределенный символ после динамической ссылки на драйвер C - PullRequest
0 голосов
/ 12 октября 2018

Я использую следующий 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.так библиотека?Я собрал драйвер libmongoc из последней версии tarball - отсюда установочный каталог / usr / local / *.Я успешно протестировал приложение - используя XCode на macOS, используя его собственную систему сборки, но я написал этот файл make , чтобы разрешить сборку на нашем * сервере Nix.

Любой совет будетс благодарностью.

1 Ответ

0 голосов
/ 12 октября 2018

Я собрал драйвер libmongoc из последней версии tarball - отсюда установочный каталог / 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...