Я использую 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, поэтому похоже, что происходит что-то смешное, что меняет манипулирование именами, когда я компилирую библиотеку, и когда я пытаюсь ссылаться на нее.
Так вот где я застрял. Я правильно интерпретирую эту информацию? Есть ли что-то, что мне нужно сделать, чтобы повлиять на искажение имени? Нужно ли мне компилировать библиотеку с разными флагами?