我正在使用以下 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服务器上构建。
任何建议将不胜感激。
答案 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;
}