Устранение ошибки компоновщика MySQL Connector / C ++ - PullRequest
0 голосов
/ 28 марта 2020

Я хотел бы иметь возможность подключиться из моей программы на С ++ к локальному экземпляру MySQL, но следующий минимальный файл тестового файла. cpp не компилируется и возвращает неопределенные ссылки:

#include <mysqlx/xdevapi.h>    
using namespace ::mysqlx;

int main()
{
    printf("Hello world!\n");
    return 0;
}

Я подозреваю, что не использовать правильные флаги компиляции. Когда я использую команду

c++ -o test1 -std=c++11 -lmysqlcppconn8 -I /usr/include/mysql-cppconn-8/ testfile.cpp 

, я получаю следующие сообщения об ошибках (переведенные на английский язык sh):

/tmp/cc02ZbBr.o: In the function "mysqlx::abi2::r0::string::traits<char>::to_str[abi:cxx11](mysqlx::abi2::r0::string const&)":
testfile.cpp:(.text._ZN6mysqlx4abi22r06string6traitsIcE6to_strB5cxx11ERKS2_[_ZN6mysqlx4abi22r06string6traitsIcE6to_strB5cxx11ERKS2_]+0x2e): undefined reference to "mysqlx::abi2::r0::string::Impl::to_utf8[abi:cxx11](mysqlx::abi2::r0::string const&)"
/tmp/cc02ZbBr.o: In the function "mysqlx::abi2::r0::DbDoc::DbDoc()":
testfile.cpp:(.text._ZN6mysqlx4abi22r05DbDocC2Ev[_ZN6mysqlx4abi22r05DbDocC5Ev]+0x1b): undefined reference to "vtable for mysqlx::abi2::r0::DbDoc"
/tmp/cc02ZbBr.o: In the function "mysqlx::abi2::r0::DbDoc::~DbDoc()":
testfile.cpp:(.text._ZN6mysqlx4abi22r05DbDocD2Ev[_ZN6mysqlx4abi22r05DbDocD5Ev]+0xf): undefined reference to "vtable for mysqlx::abi2::r0::DbDoc"
/tmp/cc02ZbBr.o: In the function "mysqlx::abi2::r0::Value::print(std::ostream&) const":
testfile.cpp:(.text._ZNK6mysqlx4abi22r05Value5printERSo[_ZNK6mysqlx4abi22r05Value5printERSo]+0x88): undefined reference to "mysqlx::abi2::r0::common::Value::print(std::ostream&) const"
/tmp/cc02ZbBr.o:(.data.rel.ro._ZTCN6mysqlx4abi22r05ValueE0_NS1_6common5ValueE[_ZTVN6mysqlx4abi22r05ValueE]+0x18): undefined reference to "typeinfo for mysqlx::abi2::r0::common::Value"
/tmp/cc02ZbBr.o:(.data.rel.ro._ZTCN6mysqlx4abi22r05ValueE0_NS1_6common5ValueE[_ZTVN6mysqlx4abi22r05ValueE]+0x20): undefined reference to "mysqlx::abi2::r0::common::Value::print(std::ostream&) const"
/tmp/cc02ZbBr.o:(.data.rel.ro._ZTIN6mysqlx4abi22r05ValueE[_ZTIN6mysqlx4abi22r05ValueE]+0x28): undefined reference to "typeinfo for mysqlx::abi2::r0::common::Value"
collect2: error: ld returned 1 exit status

Заголовок из этого файла взят из примера кода на MySQL Connector / C ++'s Github .

Этот вопрос о SO представляется актуальным, но синтаксис / каталоги могут быть устаревшими. В любом случае, я не знаю, как приспособить ответы, приведенные там, к моей ситуации и расположению библиотек. Поэтому я прошу помощи здесь.

Дополнительная информация:
Я работаю Linux Ubuntu 18.04, MySQL версия 8.0.19 и имею следующие файлы в /usr/lib/x86_64-linux-gnu/

libmysqlcppconn.so  
libmysqlcppconn.so.7.8.0.19  
libmysqlcppconn.so.7  

но я не знаю, как к ним обращаться.
В /usr/include/mysql-cppconn-8/ у меня есть каталоги jdbc/, mysql/ и mysqlx/.
Я установил следующие двоичные пакеты, используя apt менеджер пакетов: libmysqlcppconn-dev, libmysqlcppconn7, libmysqlcppconn8-1 и libmysqlcppconn8-2 (что, вероятно, излишне, но согласно руководству по установке необходимо установить довольно много этих библиотек).

which mysql возвращает /usr/bin/mysql

1 Ответ

1 голос
/ 28 марта 2020

Когда вы компилируете исходные файлы и связываете двоичные файлы с объектными файлами и библиотеками, порядок имеет значение. Общие библиотеки, предоставляющие экспортированные символы, должны следовать за объектными файлами и другими общими библиотеками, импортирующими эти символы. В вашем случае разделяемая библиотека должна быть помещена в конце приглашения команды c ++:

c++ -o test1 -std=c++11 -I /usr/include/mysql-cppconn-8/ testfile.cpp  -lmysqlcppconn8

Неопределенные символы, обнаруженные после компиляции testfile. cpp будут импортированы из следующего libmysqlcppconn8.so. Линкеры не запоминают экспортированные символы из предыдущих библиотек. Для получения дополнительной информации прочитайте эту хорошую статью: Почему порядок, в котором связаны библиотеки, иногда вызывает ошибки в G CC.

...