2009-06-14 5 views
1

Мое решение VC++ включает в себя два проекта: приложение (exe) и статическую библиотеку.Как связать статическую библиотеку в Visual C++ 2008?

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

MyApplication.obj: LNK2019 Ошибка: неразрешенный внешний символ "__declspec (DllImport) Int __cdecl MyStaticLibrary :: принять (INT, структура 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

, так что тайна - это то, что происходит от __declspec (dllimport) - предположительно, файл .h, но как он его получил? Некоторые макросы исчезли? Как дела? –

ответ

3

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

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

+0

Проверьте мое редактирование выше для получения дополнительной информации, я думаю, что это причина. – 2009-06-14 00:43:47

+0

Хм, используя надежное решение выше, все еще генерирует те же ошибки, только теперь __declspec (dllexport) - __declspec (dllimport). Мне просто нужно укусить пулю и пересмотреть мое решение, чтобы использовать DLL. – 2009-06-14 01:04:19

+0

Вы добавили UDT_STATIC в директивы препроцессора в обоих проектах и ​​перестроили оба? – Gerald

0

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

+0

Да, я включил, спасибо за проверку. – 2009-06-14 00:23:33

+0

Обычно вы получаете такую ​​ошибку, не добавляя библиотеку. Это странно. Вы уверены, что имеете это под дополнительными зависимостями? Попробуйте поместить его в общий раздел libs. –

+0

Он жалуется, что его метод класса принимает, а не функцию приема winsock. – Gerald

0

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

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

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

+0

Возможно, вы можете быть прав, посмотрите мое редактирование наверху для получения дополнительной информации. – 2009-06-14 00:42:56

Смежные вопросы