Неразрешенный внешний символ: @ 12 против @ 8 в конце имени символа - PullRequest
2 голосов
/ 21 сентября 2010

У меня нет значительного опыта работы с C ++, но недавно мне пришлось участвовать в проекте с частью C ++ (фактически, модулями apache).

Сейчас я просто пытаюсь создать какой-то существующий очень старый код и сталкиваюсь с очень странной проблемой, когда компоновщик VC ++ не может найти одну конкретную функцию в библиотеке apache (при просмотре остальных).

Код выглядит следующим образом (взят из тривиального примера, созданного специально для решения этой проблемы):

ap_rputs(ap_gm_timestr_822(r->pool, time(NULL)), r);

(это должно просто напечатать текущую дату, но это не имеет большого значения)

И ошибка, которую я получаю, выглядит так:

error LNK2019: unresolved external symbol _ap_gm_timestr_822@12 referenced in function _hello_handler

Теперь о странной части: эта функция фактически существует в библиотеке, с которой я ссылаюсь, но ее имя символа там _ap_gm_timestr_822 @ 8 (не @ 12 , но @ 8 в конце).

Я пытался играть практически со всеми возможными свойствами компилятора / компоновщика в MSVC ++ - к сожалению, безрезультатно.

Может ли эта проблема быть связана с тем, что библиотека (которая является частью дистрибутива apache 1.3) построена с другим / более старым / ... компилятором, чем я использую? В настоящее время я использую MS VC ++ Express 2008. Если это так, кто-нибудь знает, что можно сделать, чтобы обойти эту проблему?

Ответы [ 3 ]

3 голосов
/ 21 сентября 2010

time_t typedef поставляется в двух вариантах: устаревшие 32-битные, которые создадут проблему Y2K38, и 64-битные, решение этой проблемы. У вас здесь несоответствие.

Проверьте файл заголовка time.h CRT, который вы используете, в нем должен быть #ifdef, который выбирает между устаревшей и 64-битной версией. Избегайте использования наследства, если вы все еще планируете стать программистом к 2038 году.

3 голосов
/ 21 сентября 2010

В Visual Studio суффикс @ указывает общий размер аргументов в байтах.Тот факт, что он отличается между двумя функциями, означает несоответствие сигнатур.Скорее всего, учитывая разницу в размерах, вы пытаетесь связать 32-битную функцию с 64-битной.

0 голосов
/ 21 сентября 2010

Эти имена являются именами функции в сочетании с деталями типа аргументов.

Таким образом, заголовочный файл, который вы включаете, объявил функцию с аргументами, которые не соответствуют библиотеке, с которой вы связываете.

Я чаще всего сталкиваюсь с этим, когда в командной строке компилятора неверно указано «-define», поэтому я выбрал в заголовочном файле параметр, который не соответствует той библиотеке, с которой вы ссылаетесь. Часто это происходит при выборе нужной вам «многопоточности» или при использовании Unicode.

Поэтому проверьте, правильно ли ваша командная строка компилятора соответствует командной строке компоновщика.

...