Связать ошибки и искажение имени в C ++ с Visual Studio 2008 - PullRequest
2 голосов
/ 09 ноября 2010

Я использую 64-разрядную версию Visual Studio 2008 в 64-разрядной версии Windows. У меня есть проект, который ссылается на библиотеку (OpenCV 2.1). Я скомпилировал OpenCV из исходного кода, используя тот же компилятор. Моя проблема возникает как в режиме выпуска, так и в режиме отладки.

В панели «Свойства» или в моем проекте я добавил каталог, содержащий файлы заголовков, в C / C ++ -> «Дополнительные каталоги включения». Я добавил каталог, содержащий файлы .lib, в «Дополнительные каталоги библиотек», и я добавил имена библиотек в запись «Дополнительные зависимости» в Linker -> Input.

Когда я компилирую и связываю, я получаю ошибки в этом стиле: ошибка LNK2019: неразрешенный внешний символ _cvFloodFill, указанный в функции "int __cdecl Label (class cvImage &)" (? Label @@ YAHAAV? $ cvImage @ M @@@ Z) * ​​1005 *

В Linker-> Командная строка -> Дополнительные параметры я добавил тег: / verbose: lib и в окне вывода компилятора вижу, что он ищет и находит библиотеку, которая должна содержать функции (cv210d.lib). (Я посмотрел в исходном коде OpenCV и обнаружил, что рассматриваемая функция определена в этой библиотеке)

1> Связь ...
1> Поиск библиотек
1> Поиск в C: \ Program Files \ OpenCV2.1 \ lib \ cv210d.lib:

В исходном коде OpenCV он имеет внешнее объявление "C", заключающее объявление рассматриваемых функций.

Я запустил dumpbin / all в библиотечном файле, и я вижу следующие определенные символы. (У меня установлена ​​цепочка инструментов gnu для Windows, поэтому я могу использовать grep).

C: \ Program Files \ OpenCV2.1 \ lib> dumpbin / all cv210d.lib | grep cvFloodFill
732B4 __imp_cvFloodFille
732B4 cvFloodFill
1CA __imp_cvFloodFill
1CA cvFloodFill

Итак, как вы можете видеть, компоновщик ищет символ _cvFloodFill, но он не определен. определены только cvFloodFill и __imp_cvFloodFill, поэтому похоже, что происходит что-то смешное, что меняет манипулирование именами, когда я компилирую библиотеку, и когда я пытаюсь ссылаться на нее.

Так вот где я застрял. Я правильно интерпретирую эту информацию? Есть ли что-то, что мне нужно сделать, чтобы повлиять на искажение имени? Нужно ли мне компилировать библиотеку с разными флагами?

1 Ответ

1 голос
/ 09 ноября 2010

Я нашел это. (Я разместил вопрос и ответ для всех, у кого есть эта проблема, потому что я не нашел ничего подобного, когда искал в Интернете).

Когда я скомпилировал OpenCV, в разделе Свойства решения, Свойства конфигурации -> Конфигурация для платформы для всех проектов было установлено значение x64.

Когда я компилировал свой проект, платформа была установлена ​​на Win32. Ответ заключался в том, чтобы щелкнуть Configuration Manager, нажать стрелку «Вниз» в разделе «Платформа» для проекта, выбрать «Новый», а затем выбрать x64.

Итак, теперь проект и OpenCV скомпилированы для одной и той же платформы, и все связывается и работает правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...