Возникла проблема с связью общего объекта в Linux - PullRequest
0 голосов
/ 12 ноября 2018

Мне был предоставлен файл .so.

ldd libTodoAPI.so
    linux-vdso.so.1 =>  (0x00007ffc766b8000)
    libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fead8e3f000)
    libsqlite3.so => /usr/lib/libsqlite3.so (0x00007fead8b6a000)
    libQt5Network.so.5 => /usr/lib/libQt5Network.so.5 (0x00007fead8804000)
    libQt5Script.so.5 => /usr/lib/libQt5Script.so.5 (0x00007fead838b000)
    libQt5Core.so.5 => /usr/lib/libQt5Core.so.5 (0x00007fead7c4f000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fead78cd000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fead76b7000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fead72ed000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fead70e9000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fead6ecc000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fead6bc3000)
    libicui18n.so.53 => /usr/lib/libicui18n.so.53 (0x00007fead6777000)
    libicuuc.so.53 => /usr/lib/libicuuc.so.53 (0x00007fead63ec000)
    libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007fead61ea000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fead5fe2000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fead5cd1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fead949a000)
    libicudata.so.53 => /usr/lib/libicudata.so.53 (0x00007fead4649000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fead43d9000)

и с заголовком

#ifndef TODO_API_H
#define TODO_API_H

#include <string>

using namespace std;

namespace todoarea {
    class TodoAPI{
    public:
        static string checkDoer();
        static string getInformation();
        static string callTask(string funcName, string param);
        static string Done(string param);
        static string returnStatus(string param);
        static string Close();
    };
}

#endif //TODO_API_H

Я пытаюсь создать программу для вызова из этого общего объекта и у меня возникли проблемы.

//load.cpp
#include <iostream>
#include "TodoAPI.h"

using namespace todoarea;

int main(int argc, char **argv)
{
 //  TodoAPI* myTodo = new TodoAPI();
 //  myTodo>checkDoer();
 //   TodoAPI m;
   string data = TodoAPI::checkDoer();
   string a = TodoAPI::getInformation();
}

Когда я пытаюсь его скомпилировать

g++ load.cpp -lTodoAPI
/tmp/ccs1hwWP.o: In function `main':
load.cpp:(.text+0x27): undefined reference to `todoarea::TodoAPI::checkDoer[abi:cxx11]()'
load.cpp:(.text+0x33): undefined reference to `todoarea::TodoAPI::getInformation[abi:cxx11]()'
collect2: error: ld returned 1 exit status

Если я попытаюсь увидеть файл так

nm -s libTodoAPI.so
nm: libTodoAPI.so: no symbols

Также

nm -DC libTodoAPI.so  | grep todoarea
000000000000a63a T todoarea::TodoAPI::Done(std::string)
000000000000a098 T todoarea::TodoAPI::callTask(std::string, std::string)
0000000000009e9c T todoarea::TodoAPI::getInformation()
000000000000a398 T todoarea::TodoAPI::returnStatus(std::string)
0000000000009ca0 T todoarea::TodoAPI::checkDoer()
000000000000a8dc T todoarea::TodoAPI::Close()

В нем содержится много функций (в основном, похоже на Qt), когда я пытаюсь использовать nm с опцией -D.

Вопрос: Как я могу использовать эту библиотеку для создания приложения в Linux? Что я делаю неправильно? Я пытался вызывать функции динамически, но не получилось. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 12 ноября 2018

Вы недовольны разрывом ABI между выпуском GCC с libTodoAPI.so был построен и тот, с которым вы компилируете свой код. См. Устранение двойного ABI

Устранение неполадок

Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в std :: __ cxx11 namespace или тег [abi: cxx11], то это, вероятно, означает, что вы пытаясь связать вместе объектные файлы, которые были скомпилированы с различными значениями для _GLIBCXX_USE_CXX11_ABI макрос. Это обычно происходит при подключении к сторонней библиотеке, которая был скомпилирован с более старой версией GCC. Если сторонняя библиотека не может быть восстановлена с новым ABI вам нужно будет перекомпилировать ваш код со старым ABI.

...