mongocxx - неопределенная ссылка на все функции - PullRequest
1 голос
/ 12 апреля 2020

Я собрал драйверы mongocxx и bsoncxx в соответствии с инструкциями на официальном сайте. Теперь я связал .lib файлы bsoncxx и mongocxx с моим проектом C ++, и если я пытаюсь запустить мое приложение main.cpp, оно выдает ошибку, как указано ниже:

CMakeFiles\enabler_app.dir/objects.a(main.cpp.obj): In function `main':

main.cpp:12: undefined reference to `__imp__ZN8mongocxx7v_noabi8instanceC1Ev'
main.cpp:13: undefined reference to `__imp__ZN8mongocxx7v_noabi3uriC1EN7bsoncxx7v_noabi6string13view_or_valueE'
main.cpp:14: undefined reference to `__imp__ZN8mongocxx7v_noabi6clientC1ERKNS0_3uriERKNS0_7options6clientE'
main.cpp:16: undefined reference to `__imp__ZNK8mongocxx7v_noabi10collectioncvbEv'
main.cpp:16: undefined reference to `__imp__ZN8mongocxx7v_noabi10collectionD1Ev'
main.cpp:15: undefined reference to `__imp__ZN8mongocxx7v_noabi8databaseD1Ev'
main.cpp:14: undefined reference to `__imp__ZN8mongocxx7v_noabi6clientD1Ev'
main.cpp:13: undefined reference to `__imp__ZN8mongocxx7v_noabi3uriD1Ev'
main.cpp:12: undefined reference to `__imp__ZN8mongocxx7v_noabi8instanceD1Ev'

collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[2]: *** [CMakeFiles\enabler_app.dir\build.make:137: enabler_app.exe] Error 1
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:75: CMakeFiles/enabler_app.dir/all] Error 2
mingw32-make.exe: *** [Makefile:83: all] Error 2

Являются ли эти ошибки из-за проблема с ссылками? На данный момент я просто связал, как показано ниже в моем CMakeLists.txt:

add_library(MONGOCXX SHARED IMPORTED)
set_property(TARGET MONGOCXX PROPERTY IMPORTED_IMPLIB ${CMAKE_CURRENT_LIST_DIR}/mongo_db_driver/lib/mongocxx.lib)
include_directories(${CMAKE_CURRENT_LIST_DIR}/mongo_db_driver/include/mongocxx/v_noabi)
target_link_libraries(${PROJECT_NAME} MONGOCXX)

add_library(BSONCXX SHARED IMPORTED)
set_property(TARGET BSONCXX PROPERTY IMPORTED_IMPLIB ${CMAKE_CURRENT_LIST_DIR}/mongo_db_driver/lib/bsoncxx.lib)
include_directories(${CMAKE_CURRENT_LIST_DIR}/mongo_db_driver/include/bsoncxx/v_noabi)
target_link_libraries(${PROJECT_NAME} BSONCXX)

add_library(MONGOC SHARED IMPORTED)
set_property(TARGET MONGOC PROPERTY IMPORTED_IMPLIB ${CMAKE_CURRENT_LIST_DIR}/mongo_c_driver/lib/mongoc-1.0.lib)
include_directories(${CMAKE_CURRENT_LIST_DIR}/mongo_c_driver/include/libmongoc-1.0)
target_link_libraries(${PROJECT_NAME} MONGOC)

add_library(BSONC SHARED IMPORTED)
set_property(TARGET BSONC PROPERTY IMPORTED_IMPLIB ${CMAKE_CURRENT_LIST_DIR}/mongo_c_driver/lib/bson-1.0.lib)
include_directories(${CMAKE_CURRENT_LIST_DIR}/mongo_c_driver/include/libbson-1.0)
target_link_libraries(${PROJECT_NAME} BSONC)

Main. cpp

int main () {
    mongocxx::instance instance{};
    mongocxx::uri uri("mongodb://localhost:27017");
    mongocxx::client client(uri);

    return 0;
}

Примечание: я включил требуемые заголовки уже в основную функцию. Я сделал то же самое для другой сторонней библиотеки, которая отлично работает для меня.

Как мне это исправить?

1 Ответ

0 голосов
/ 13 апреля 2020

Вы не указали расположение общих импортируемых целей (то есть файлов DLL). Из документации CMake, при использовании свойства IMPORT_IMPLIB, вы должны:

Установить это для расположения .lib части DLL Windows, [ ...]

Однако при импорте цели вы должны всегда установить свойство IMPORTED_LOCATION, так как это фактическое значение импортированный целевой файл. Для Windows библиотек DLL, для которых требуются файлы .lib, вы можете использовать это:

add_library(MONGOCXX SHARED IMPORTED)
set_property(TARGET MONGOCXX PROPERTY IMPORTED_LOCATION 
    ${CMAKE_CURRENT_LIST_DIR}/mongo_db_driver/lib/mongocxx.dll
)
set_property(TARGET MONGOCXX PROPERTY IMPORTED_IMPLIB 
    ${CMAKE_CURRENT_LIST_DIR}/mongo_db_driver/lib/mongocxx.lib
)

Кроме того, вы можете упростить это, используя только свойство IMPORTED_LOCATION, как описано в этот ответ :

add_library(MONGOCXX SHARED IMPORTED)
set_property(TARGET MONGOCXX PROPERTY IMPORTED_LOCATION 
    ${CMAKE_CURRENT_LIST_DIR}/mongo_db_driver/lib/mongocxx.lib
)
...