动态链接C驱动程序后的未定义符号

时间:2018-10-12 02:02:35

标签: c mongodb gcc makefile shared-libraries

我正在使用以下 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服务器上构建。

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

  

我已经从最新的tarball构建了libmongoc驱动程序-因此,安装目录为/ usr / local / *

在标准系统目录(#include <QApplication> #include <QInputDialog> #include <QDebug> #include <QAbstractButton> #include <QDialogButtonBox> #include <QTimer> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget widget; bool ok; QTimer::singleShot(0, [](){ for(QWidget *widget: QApplication::topLevelWidgets()){ if(QInputDialog *dialog = qobject_cast<QInputDialog*>(widget)){ for(QAbstractButton *btn: dialog->findChild<QDialogButtonBox*>()->buttons()){ btn->setIcon(QIcon()); } } } }); int res = QInputDialog::getInt(nullptr, "Factorial Calc", "Factorial of:", 5, 0, 100, 1, &ok); if(ok) qDebug()<< res; return 0; } 或系统的默认设置)中还有 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

答案 1 :(得分:0)

您正在使用“ libmongoc” 1.0版,因此对于此版本,应使用相同的示例。请获取相关的示例表格,例如:

http://mongoc.org/libmongoc/1.0.0/index.html

例如要插入一条记录,请使用此:

#include <bson.h>
#include <mongoc.h>
#include <stdio.h>

int
main (int   argc,
      char *argv[])
{
    mongoc_client_t *client;
    mongoc_collection_t *collection;
    mongoc_cursor_t *cursor;
    bson_error_t error;
    bson_oid_t oid;
    bson_t *doc;

    mongoc_init ();

    client = mongoc_client_new ("mongodb://localhost:27017/");
    collection = mongoc_client_get_collection (client, "test", "test");

    doc = bson_new ();
    bson_oid_init (&oid, NULL);
    BSON_APPEND_OID (doc, "_id", &oid);
    BSON_APPEND_UTF8 (doc, "hello", "world");

    if (!mongoc_collection_insert (collection, MONGOC_INSERT_NONE, doc, NULL, &error)) {
        printf ("%s\n", error.message);
    }

    bson_destroy (doc);
    mongoc_collection_destroy (collection);
    mongoc_client_destroy (client);

    return 0;
}