GCC ошибки Компоновщика C++: Неопределенная ссылка на 'vtable для XXX', Неопределенная ссылка на 'ClassName:: ClassName ()'

Замена URL со ссылками (Отвечают на Общую проблему)

регулярное выражение в вопросе промахи много из пограничных случаев. При обнаружении URL всегда лучше пользоваться специализированной библиотекой, которая обрабатывает международные доменные имена, новый TLDs как .museum, круглые скобки и другая пунктуация в и в конце URL и многих других пограничных случаев. Посмотрите сообщение в блоге Jeff Atwood проблема С URL для объяснения некоторых из других проблем.

лучшая сводка библиотек соответствия URL находится в [1 117] , Ответ Dan Dascalescu +100
(по состоянию на февраль 2014)

"Заставляет регулярное выражение заменить больше чем одно соответствие" (Ответьте на определенную проблему)

Добавляют "g" до конца регулярного выражения для включения глобального соответствия:

/ig;

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

70
задан Alex Black 7 July 2009 в 23:19
поделиться

2 ответа

Предполагая, что эти методы находятся в одной из библиотек, это выглядит как проблема с упорядочением.

При компоновке библиотек в исполняемый файл они выполняются в том порядке, в котором они объявлены.
Кроме того, компоновщик будет принимать только методы / функции, необходимые для разрешения текущих незавершенных зависимостей. Если последующая библиотека затем использует методы / функции, которые изначально не требовались объектами, у вас будут отсутствующие зависимости.

Как это работает:

  • Возьмите все объектные файлы и объедините их в исполняемый файл
  • Устраните любые зависимости среди объектных файлов.
  • Для каждой библиотеки в порядке:
    • Check unresolved dependencies and see if the lib resolves them.
    • If so load required part into the executable.

Example:

Objects requires:

  • Open
  • Close
  • BatchRead
  • BatchWrite

Lib 1 provides:

  • Open
  • Close
  • read
  • write

Lib 2 provides

  • BatchRead (but uses lib1:read)
  • BatchWrite (but uses lib1:write)

If linked like this:

gcc -o plop plop.o -l1 -l2

Then the linker will fail to resolve the read and write symbols.

But if I link the application like this:

gcc -o plop plop.o -l2 -l1

Then it will link correctly. As l2 resolves the BatchRead and BatchWrite dependencies but also adds two new ones (read and write). When we link with l1 next all four dependencies are resolved.

74
ответ дан 24 November 2019 в 13:09
поделиться

Эта ошибка компоновщика обычно (по моему опыту) означает, что вы переопределили виртуальную функцию в дочернем классе с помощью объявления, но не дали определения для метода. Например:

class Base
{
    virtual void f() = 0;
}
class Derived : public Base
{
    void f();
}

Но вы не дали определения f. Когда вы используете класс, вы получаете ошибку компоновщика. Как и обычная ошибка компоновщика, это потому, что компилятор знал, о чем вы говорите, но компоновщик не смог найти определение. Просто у него очень трудное для понимания сообщение.

166
ответ дан 24 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: