Неизвестный источник предупреждения: «не удается найти символ компоновщика для виртуальной таблицы для ...» - PullRequest
3 голосов
/ 18 января 2011

Через несколько дней я получаю сообщение с предупреждением при отладке. Я не могу найти, откуда это. Я уже гуглил и нашел такие вещи, потому что у меня есть статическая переменная. Но снятие этого ничего не меняет.

Это метод main:

int main(int argc, char* argv[]) {
    if (argc != 2) {
        cout << "ERROR: Wrong amount of arguments!...\n"
             << endl;
        cout << "\n" << "Programm closed...\n\n" << endl;
    cin.ignore();
    exit(1);
    return 0;
    }

    cout << "argv[1] " << argv[1] << endl;

    GenericCommandConverter a(argv[1]);
    a.getCommandsFromCSV();

    cout << "\n" << "Programm finished...\n\n" << endl;

    return 0;
}

Код, где это происходит в первый раз:

void GenericCommandConverter::getATCommandsFromCSV() {

    cout << "+++++++++++getCommandsFromCSV) started++++++++++++++" << endl;

    string filename_csv = "test.csv";
    string commands = "";
   int pos_start = 0;
    int pos_end = 0;
    int substrLength = 0;
    int separator_count = 0;

    char c;

    vector<string> lines;
    vector<string> commandList;
    vector<unsigned int> parameterPositionList;
    vector<vector<string> > linesSeparated;
    vector<vector<string> > part1_input;
    vector<vector<string> > part2_output;
    vector<map<vector<string> , vector<string> > > listedParameterMap;

    ifstream csvFile;
    csvFile.open(filename_csv.c_str(), ios_base::in);

    cout << "i'm starting getCommandsFromCSV()...\n" << endl;

    /**
     * STEP 1
     * Putting input text file into a string
     */
    if (csvFile.is_open()) {
        while (!csvFile.eof()) { // <------- warning occurs here!
                csvFile.get(c);
            commands += c;
    }

...

}

Внимание:

[New Thread 2000.0x11bc]
warning: can't find linker symbol for virtual table for
`std::less<std::vector<std::basic_string<char, std::char_traits<char>,
std::allocator<char> >, std::allocator<std::basic_string<char, 
std::char_traits<char>,     std::allocator<char> > > > >' value

Кто-нибудь знает, почему это происходит? Он идет с каждой строкой, пока не начнется. Он настолько заполняет консоль, что отладка невозможна. Другая, может быть важная информация о автономном режиме, эта ошибка не отображается.

Я бы очень признателен за помощь!

РЕДАКТИРОВАТЬ: заголовочный файл

#ifndef CommandConverter_H_
#define CommandConverter_H_

#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <iosfwd>
#include <map>
#include <vector>
#include <cstdio>

using namespace std;

class CommandConverter {
public:
    CommandConverter(char* file);
    virtual ~CommandConverter();

    void printConvertedTraceByPage(vector<string> lines);

    map<string, vector<map<vector<string> , vector<string> > > > csvMap;
    static const int MAX_SIZE = 5;

    void getATCommandsFromCSV();
    string readTxtFile();
    vector<string> splitIntoLines(const char* trace);
    vector<string> convert(vector<string> fileInLines);

    bool commandAvailable(const char* l, int pos, const char* s);
    void error(const char* p, const char* p2);
    void printCSV();

    // opened in constructor; closed in destructor
    ifstream myfile;
    string filename;
    string trace_raw;
};

#endif /* CommandConverter_H_ */

Ответы [ 2 ]

10 голосов
/ 20 января 2011

Сообщение приходит от этого кода в gdb/gnu-v3-abi.c:

static struct type *
gnuv3_rtti_type (struct value *value,
                 int *full_p, int *top_p, int *using_enc_p)
{
...
  /* The symbol's demangled name should be something like "vtable for
     CLASS", where CLASS is the name of the run-time type of VALUE.
     If we didn't like this approach, we could instead look in the
     type_info object itself to get the class name.  But this way
     should work just as well, and doesn't read target memory.  */
  vtable_symbol_name = SYMBOL_DEMANGLED_NAME (vtable_symbol);
  if (vtable_symbol_name == NULL
      || strncmp (vtable_symbol_name, "vtable for ", 11))
    {
      warning (_("can't find linker symbol for virtual table for `%s' value"),
               TYPE_NAME (values_type));
      if (vtable_symbol_name)
        warning (_("  found `%s' instead"), vtable_symbol_name);
      return NULL;
    }

Теперь я совершенно уверен, что std::less не должен иметь виртуальную таблицу, поэтому вполне вероятно, чтоGDB сбит с толку.

Вам необходимо проверить, существует ли проблема с последней версией GDB, и сообщить об ошибке.

Поскольку это только недавно началось, обновили ли вы свой GCC, GDB,или изменили флаги компиляции?

1 голос
/ 30 апреля 2017

Ответ на заголовок вопроса, но не на вопрос ОП (поскольку поиск по сети привел меня сюда): еще один источник этого сообщения состоит в том, что gdb может запутаться еще не инициализированными переменными.

Естественно, у вас не должно быть неинициализированных переменных, но в моем случае gdb пытается показать локальные переменные функции даже до того, как они объявлены / инициализированы.

Сегодня я перебираю случай с другим разработчиком, и это сообщение выводилось на экран каждый раз, когда отладчик останавливался. В этом случае рассматриваемая переменная была объявлена ​​в строке 245, но функция запускалась в строке 202. Каждый раз, когда я останавливал отладчик между этими строками, я получал сообщение.

Я обошел проблему, переместив объявление переменной в начало функции.

Для справки: я тестирую с помощью gdb версии 7.11.1 в QtCreator 4.1.0 и скомпилировал с g ++ версии 5.4.1

...