使用CMake链接C/C++库

3
我需要在C++项目中使用MongoDB C驱动程序。我想使用CMake,因为我使用的IDE与其集成得很好,但编译器无法识别MongoDB驱动程序。
所以,我尝试了一些其他方法并提供了更多信息。我制作了以下脚本:
cmake_minimum_required(VERSION 3.2)
project(sorting)

set(ENV{PKG_CONFIG_PATH} "/usr/lib64")
find_package(PkgConfig REQUIRED)

pkg_search_module(MONGO REQUIRED mongoc-1.0)


message(SEND_ERROR "A ${MONGO_FOUND}")        # Error:A 1
message(SEND_ERROR "B ${MONGO_LIBRARIES}")    # Error:B ssl;crypto;rt;mongoc-1.0;bson-1.0
message(SEND_ERROR "C ${MONGO_LIBRARY_DIRS}") # Error:C /usr/lib64
message(SEND_ERROR "D ${MONGO_LDFLAGS}")      # Error:D -L/usr/lib64;-lssl;-lcrypto;-lrt;-lmongoc-1.0;-lbson-1.0
message(SEND_ERROR "E ${MONGO_LDFLAGS_OTHER}")# Error:E
message(SEND_ERROR "F ${MONGO_INCLUDE_DIRS}") # Error:F /usr/include/libmongoc-1.0;/usr/include/libbson-1.0
message(SEND_ERROR "G ${MONGO_CFLAGS}")       # Error:G -I/usr/include/libmongoc-1.0;-I/usr/include/libbson-1.0
message(SEND_ERROR "H ${MONGO_CFLAGS_OTHER}") # Error:H


include_directories(${MONGO_LIBRARY_DIRS})
include_directories(${MONGO_INCLUDE_DIRS})

#link_directories(${MONGO_LIBRARY_DIRS})
#link_directories(${MONGO_INCLUDE_DIRS})


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}   -std=c++11")
set(SOURCE_FILES main.cpp)

add_executable(sorting ${SOURCE_FILES})
target_link_libraries(sorting ${MONGO_LIBRARIES})

当我从CMake文件中删除所有的message()函数并尝试使用未注释的include_directories运行项目时,出现以下错误:error while loading shared libraries: libmongoc-1.0.so.0: cannot open shared object file: No such file or directory。当我注释掉include_directories并取消注释link_directories时,出现以下错误:fatal error: mongoc.h: No such file or directory #include <mongoc.h>。此外,只是出于好奇,为什么如果我将pkg_search_module中的MONGO更改为诸如MONGODBMONG之类的名称,我会收到以下错误:Error:None of the required 'mongoc-1.0' found

这个语法 libmongo1.0>=1.0 看起来很奇怪!如果写成 libmongo1.0 >= 1.0 会更好看,当你在 shell 中执行 pkg-config libmongo1.0 的时候,请告诉我输出结果。 - Iharob Al Asimi
你的 pkg-config 调用和 cmake 文件中的不一致! - Iharob Al Asimi
谢谢您的回答。当我执行pkg-config libmongoc-1.0时,我就没有得到任何输出。 如果我执行pkg-config --cflags --libs libmongoc-1.0我会得到以下输出-I/usr/include/libmongoc-1.0 -I/usr/include/libbson-1.0 -L/usr/lib64 -lssl -lcrypto -lrt -lmongoc-1.0 -lbson-1.0 - Carlos Teixeira
没错,你试过我的答案了吗? - Iharob Al Asimi
是的,我有。我将PKG_SEARCH_MODULE更改为PKG_SEARCH_MODULE(MONGO_DB REQUIRED libmongoc-1.0),以及PKG_SEARCH_MODULE(MONGO_DB REQUIRED libmongoc-1.0 >= 1.0)。两次都出现了这个错误:fatal error: mongoc.h: No such file or directory #include <mongoc.h> - Carlos Teixeira
显示剩余5条评论
3个回答

3
您需要告诉CMake链接到monog库,这可以通过以下方式实现:
TARGET_LINK_LIBRARIES

在你的情况下,“command”指的是ADD_EXECUTABLE命令之后的一条命令,与其格式完全相同。
TARGET_LINK_LIBRARIES(sorting ${MONGO_DB_LIBRARIES})

此外,您的PKG_SEARCH_MODULE似乎有误,看起来应该是:
PKG_SEARCH_MODULE(MONGO_DB REQUIRED libmongoc-1.0)

谢谢您的回答。我已经按照您的建议做了,但仍然无法正常工作。 - Carlos Teixeira

3

我可以使用以下编译mongo示例代码:

cmake_minimum_required(VERSION 2.8)
project(sorting)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)

include_directories(/usr/include/libmongoc-1.0 /usr/include/libbson-1.0)

find_library(MONGODB_LIBRARY mongoc-1.0)
find_library(BSON_LIBRARY bson-1.0)

add_executable(sorting ${SOURCE_FILES})
target_link_libraries(sorting ${MONGODB_LIBRARY} ${BSON_LIBRARY})

你可以尝试使用这个 CMakeFiles.txt 文件吗?

顺便说一下,有一个专门为 C++ 项目编写的 mongo 驱动程序!


谢谢你的回答。我已经尝试了你提供的配置,但我仍然无法编译这个项目。MONGODB_LIBRARYBSON_LIBRARY都被设置为NOTFOUND。此外,我发现不知何故在我的代码中从未引用过的MongoDB_INCLUDE_DIRMongoDB_LIBRARIES分别设置为/usr/include/usr/lib/libmongoclient.a。 我知道有一个C++驱动程序,但该项目的要求之一是必须使用C编写。 - Carlos Teixeira
请更新您的帖子,附上实际的CMakeLists.txt文件,以更清楚地说明您当前的尝试!如果您有MongoDB_INCLUDE_DIR和MongoDB_LIBRARIES,则意味着您在CMakeLists中使用了find_package(MongoDB),该文件已找到_FindMongoDB.cmake_文件。 - explo91

3

我终于做到了!环境变量LD_LIBRARY_PATH被我的IDE(CLION)覆盖了。我在IDE设置中将其设置为指向库目录,现在一切正常。这是我使用的配置:

cmake_minimum_required(VERSION 3.2)
project(sorting C)


set(ENV{PKG_CONFIG_PATH} "")
find_package(PkgConfig REQUIRED)

pkg_search_module(MONGO REQUIRED mongoc)

include_directories(${MONGO_INCLUDE_DIRS})
include_directories(${MONGO_LIBRARY_DIRS})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.c)

add_executable(sorting ${SOURCE_FILES})
target_link_libraries(sorting ${MONGO_LIBRARIES} )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接