Visual Studio LNK1104 вместо LNK2019
Я не понимаю, как Visual Studio (2015 для меня) может определить имя файла.lib из файла заголовка.
Пример 1
я использую boost/asio
написать простую программу для подключения через HTTP-запрос. Исходный файл включает в себя <boost/asio.hpp>
на нем. Я тоже конфиг C/C++ / General / Additional Include Directories
указать на папку Boost.
После этого я строю решение и сталкиваюсь с ошибкой:
Error LNK1104 cannot open file 'libboost_system-vc140-mt-gd-1_61.lib'
Но я не знаю, где Visual Studio находит имя libboost_system-vc140-mt-gd-1_61.lib
от.
- Ищу в Linker / Input / Additional Dependencies / Edit...
как для оценочного значения, так и для унаследованного значения не существует элемента с именем libboost_system-vc140-mt-gd-1_61.lib
- Я думаю, что в <boost/asio.hpp>
каким-то образом он установил некоторую информацию для компилятора, что: "Если вам нужен файл lib, найдите libboost_system-vc140-mt-gd-1_61.lib, это моя реализация", но я ищу в папке boost, там нет исходный файл содержит "libboost_system-vc140-mt-gd-1_61.lib"
Обычно, если какая-то функция объявлена в заголовочном файле, а Visual Studio не может подать ее реализацию, LNK2019: unresolved external symbol ...
будет бросить.
Тогда, если его реализация находится в abcxyz.lib
файл, пользователь переходит к Linker / Input / Additional Dependencies
и добавить abcxyz.lib
, без указания папки, содержащей файл.lib в Linker / General / Additional Libary Directories
, В этой ситуации Error LNK1104 cannot open file 'abcxyz.lib'
будет брошен
Итак, почему в приведенном выше примере вместо ошибки LNK2019 встречается ошибка LNK1104?
Пример 2
Я работаю над проектом, который использует библиотеку OpenCV 2.4.10. В дистрибутиве они дают мне проект с исходным кодом, но без привязки ко мне библиотеки.
Затем я загружаю последнюю версию OpenCV 2.4.13 и настраиваю для проекта, такую как дополнительная папка включения, дополнительная папка библиотеки, дополнительные зависимости (opencv_core2413.lib
).
Все выглядит нормально, но когда я собираю проект, он выдает ошибку:
Error LNK1104 cannot open file 'opencv_core2410d.lib'
Я смотрел на Linker \ Input \ Additional Dependencies
как для оценочного значения (содержит opencv_core2413.lib), так и для унаследованного значения, но нет элемента с именем "opencv_core2410d.lib".
Попробуйте поискать в другом общем списке свойств, который применим к проекту, но нет элемента записи с именем 'opencv_core2410d.lib'
Я хочу удалить эту запись, но не могу найти, где она находится
Итак, что здесь происходит? Кто-нибудь может объяснить для меня? Спасибо
2 ответа
В Visual Studio вы можете вставить в файл.obj запрос библиотеки, используя
#pragma comment( lib, "libname.lib" )
Это заставляет компоновщик искать libname в пути к библиотеке и гарантирует, что используется правильная библиотека.
Это можно отключить с помощью /nodefaultlib
по ссылке.
В окнах реализация классов меняется между выпуском и отладкой (дополнительные элементы отслеживания добавляются в структуры при отладке).
Механизм реализации приближения и запуска CRT различается в зависимости от того, вызывается DllMain или нет.
Более современные визуальные студии также имеют
#pragma detect_mismatch( "name", "value")
Который помещает объявление в каждый объектный файл со своим значением для "значения". Это гарантирует, что если структуры изменяются между версиями или параметрами компиляции, они становятся несовместимыми друг с другом.
LNK1104
позволяет узнать, что вам нужно установить местоположение библиотеки в Library Directories
,
boost::asio
зависит от boost::system
для сообщений об ошибках. boost::system
не библиотека только для заголовков.
Вам нужно добавить местоположение boost
библиотеки в Library Directories
под VC++ Directories
на страницах свойств вашего решения.
Если вы не построили boost
библиотек пока нет, есть статья, как это сделать здесь, или вы можете скачать ее здесь.
Добавление местоположения OpenCV
библиотеки на страницах свойств вашего решения должны исправить Example 2
,