Как связать статическую библиотеку в Visual C ++ 2008? - PullRequest
1 голос
/ 14 июня 2009

Мое решение VC ++ включает в себя два проекта, приложение (exe) и статическую библиотеку.

Оба компилируются нормально, но не могут связать. Я получаю ошибку «неразрешенный внешний символ» для каждой функции из используемой статической библиотеки. Они выглядят так:

MyApplication.obj: ошибка LNK2019: неразрешенный внешний символ "__declspec (dllimport) int __cdecl MyStaticLibrary :: accept (int, struct sockaddr *, int *)"

Приложение находит .lib просто отлично, так что это не проблема. Я думаю, что проблема заключается в «dllimport» - почему это происходит, когда я пытаюсь создать статическую библиотеку? И приложение, и библиотека используют библиотеку времени выполнения «Многопоточная (/ MT)», а не «Многопоточная DLL (/MD)".

»).

EDIT:

Я думаю, что некоторые ответы верны. Библиотека, которая называется UDT, имеет это в главном заголовочном файле:

#ifdef UDT_EXPORTS
   #define UDT_API __declspec(dllexport)
#else
   #define UDT_API __declspec(dllimport)
#endif

Значит ли это, что он не предназначен для использования в качестве статической библиотеки?

Ответы [ 3 ]

3 голосов
/ 14 июня 2009

Как вы настраиваете ссылку? А как выглядит ваш заголовочный файл для MyApplication и MyStaticLibrary :: accept?

Если у вас есть оба проекта в одном и том же файле решения, лучший способ установить его в виде ссылки - щелкнуть правой кнопкой мыши файл решения-> Свойства и затем установить библиотеку в качестве зависимости приложения. Visual Studio будет обрабатывать ссылки автоматически, а также следить за тем, чтобы при сборке приложения была установлена ​​последняя версия библиотеки.

Эта ошибка звучит так, будто она определена как импорт / экспорт DLL в вашем заголовочном файле.

Edit: Да, это проблема. Вы, вероятно, сначала создали его как динамическую библиотеку? (или кто бы это ни написал.)

Есть несколько вариантов.

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 в свои проекты, если вы хотите использовать ее в качестве статической библиотеки, и удалите ее, если вы хотите использовать ее в качестве динамической библиотеки. (Необходимо добавить в оба проекта.)

0 голосов
/ 14 июня 2009

Похоже, что экспортированные функции в статической библиотеке имеют неправильное соглашение о вызовах. Как выглядит заголовочный файл для экспортируемых функций?

Хорошо, поэтому функции используют UDT_API в качестве префикса. Они не должны делать это, если вы просто создаете статический .lib для ссылки.

Альтернативой является изменение библиотеки lib для создания dll. Таким образом, вы создаете статическую связь с DLL. Единственная проблема заключается в том, что вы должны предоставить dll с вашим приложением. Все еще не плохое решение, так как оно позволяет вам делать исправления в lib.

0 голосов
/ 14 июня 2009

Поскольку вы работаете с сокетами, обязательно добавьте WS2_32.lib в дополнительные зависимости проекта.

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