Как связать статическую библиотеку в Visual C++ 2008?
Мое решение VC++ включает в себя два проекта, приложение (exe) и статическую библиотеку.
Оба компилируются нормально, но не связываются. Я получаю ошибку "неразрешенный внешний символ" для каждой функции из используемой статической библиотеки. Они выглядят так:
MyApplication.obj: ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) int __cdecl MyStaticLibrary::accept(int,struct sockaddr *,int *)"
Приложение находит.lib просто отлично, так что это не проблема. Я думаю, что "dllimport" является проблемой - почему это будет, когда я пытаюсь создать статическую библиотеку? И приложение, и библиотека используют библиотеку времени выполнения "Многопоточная (/MT)", а не "Многопоточная DLL (/MD)".
РЕДАКТИРОВАТЬ:
Я думаю, что некоторые ответы верны. Библиотека, которая называется UDT, имеет это в главном заголовочном файле:
#ifdef UDT_EXPORTS
#define UDT_API __declspec(dllexport)
#else
#define UDT_API __declspec(dllimport)
#endif
Означает ли это, что он не предназначен для использования в качестве статической библиотеки?
3 ответа
Как вы настраиваете ссылку? А как выглядит ваш заголовочный файл для MyApplication и MyStaticLibrary::accept?
Если у вас есть оба проекта в одном файле решения, лучший способ установить его в виде ссылки - щелкнуть правой кнопкой мыши файл решения-> Свойства, а затем установить библиотеку в качестве зависимости приложения. Visual Studio будет обрабатывать ссылки автоматически, а также следить за тем, чтобы при сборке приложения была установлена последняя версия библиотеки.
Эта ошибка звучит так, будто она определена как импорт / экспорт DLL в вашем заголовочном файле.
Редактировать: Да, это проблема. Вы, вероятно, сначала создали его как динамическую библиотеку? (или кто бы ни написал это сделал.)
Есть несколько вариантов.
1) Вы можете просто удалить все эти вещи и любые модификаторы UDT_API в коде.
2) Вы можете удалить этот материал и добавить эту строку:
#define UDT_API
3) Более надежное решение состоит в том, чтобы изменить это на это:
#ifdef UDT_STATIC
#define UDT_API
#else
#ifdef UDT_EXPORTS
#define UDT_API __declspec(dllexport)
#else
#define UDT_API __declspec(dllimport)
#endif
#endif
Затем добавьте директиву препроцессора UDT_STATIC в свои проекты, если вы хотите использовать ее в качестве статической библиотеки, и удалите ее, если хотите использовать ее в качестве динамической библиотеки. (Нужно добавить в оба проекта.)
Поскольку вы работаете с сокетами, обязательно добавьте WS2_32.lib в дополнительные зависимости проекта.
Похоже, что экспортированные функции в статической библиотеке имеют неправильное соглашение о вызовах. Как выглядит заголовочный файл для экспортируемых функций?
Итак, функции используют UDT_API в качестве префикса. Они не должны делать это, если вы просто создаете статический.lib для ссылки.
Альтернатива состоит в том, чтобы изменить библиотеку вместо создания библиотеки DLL. Таким образом, вы создаете статическую связь с DLL. Единственная проблема заключается в том, что вы должны предоставить dll с вашим приложением. Все еще не плохое решение, так как оно позволяет вам делать исправления в lib.