Как связать статическую библиотеку в 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.

Другие вопросы по тегам