Странная ошибка связи - LNK1224: недопустимая база изображений - PullRequest
1 голос
/ 25 августа 2011

У меня есть некоторые реальные трудности при переносе действительно старого проекта Visual Studio 97 C ++ в Visual Studio 2010. Позвольте мне сначала немного рассказать об ошибках, которые я получил непосредственно перед этой новой ошибкой LNK1224, потому что они могут быть связаны, но я не уверен.

До моей новой ошибки я получал эту ошибку:

error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj)  nafxcw.lib(afxmem.obj)

В ходе некоторых копаний я обнаружил, что причиной этой ошибки было то, что библиотеки MFC и CRT содержат определения «new» и «delete», поэтому они сталкивались. Microsoft предоставляет 2 решения для этого подробно в http://support.microsoft.com/kb/q148652/. Одним из них было убедиться, что во всех ваших файлах вы всегда в первую очередь включаете заголовки MFC (afx stuff) В этом проекте около 100 файлов, и я просто устал пытаться найти файлы, которые включали ресурсы, в неправильном порядке. Поэтому я выбрал другое решение, которое в основном заставляет библиотеки загружаться в определенном порядке. По сути, вы должны указать компилятору игнорировать определенную библиотеку, чтобы вы могли явно загрузить ее самостоятельно в выбранном вами порядке. В моем случае это был nafxcw.lib.

Таким образом, в разделе «Свойства проекта» -> «Линкер» -> «Ввод» я явно проигнорировал файл nafxcw.lib, а затем явно включил его в начало списка.

Properties window

Так что после этого мои ошибки LNK2005 исчезли. Но они были заменены одной ошибкой ссылки.

error LNK1224: invalid image base 0x287600000

Я не знаю, правильно ли я исправил свои предыдущие ошибки ссылки, и эта новая ошибка ссылки фактически является следующей вещью, с которой мне приходится иметь дело, или я просто создал более критическую ошибку ссылки, которая в основном останавливает процесс компоновки перед он попадает в мои оригинальные ошибки LNK2005. В любом случае, я не нашел много информации об этой ошибке. Microsoft не говорит много в этой ссылке об этом http://msdn.microsoft.com/en-us/library/3ya3f8wz%28v=vs.80%29.aspx

Вы указали неверный базовый адрес для изображения. Базовые адреса должны быть выровнены по 64 КБ (последние четыре шестнадцатеричных цифры должны быть равны нулю), а базовый адрес должен соответствовать 32-битному знаку или знаку без знака.

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

1 Ответ

0 голосов
/ 26 августа 2011

ОК, похоже, я решил свою проблему. Вот что я сделал. Мне нужно было знать, откуда взялся этот номер, поэтому я просто использовал Notepad ++ для поиска слов по всем файлам проекта в поисках «2876», которое я получил из сообщения об ошибке «ССЫЛКА: фатальная ошибка LNK1224: недопустимая база изображений 0x287600000 ». Я обнаружил, что в файле проекта (.vcxproj) есть следующая запись:

<BaseAddress>0x287600000</BaseAddress>

Так что я открыл его и сел там, задаваясь вопросом, как этот номер был неправильным Я имею в виду, я даже не знаю, для чего это поле. Я даже не генерировал этот файл, M $ сделал это. Почему среда IDE создала свой собственный входной файл неправильно? В любом случае, когда я пытался отыскать этот элемент «BaseAddress», чтобы выяснить, что это было, меня осенило, что, похоже, слишком много нулей. Поэтому я вернулся и посчитал, и, конечно же, это было не 32-разрядное число, а 36-разрядное число. Удалил один из нулей, перекомпилировал, и бум сработал. Низко и вот, это то, на что намекало то определение, которое я посмотрел, упомянутое в описании проблемы, на которое мы смотрели ранее на MSDN, но оно не щелкнуло.

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

...