C ++ Project компилируется как статическая библиотека, завершается с ошибкой (ошибка компоновщика) как динамическая библиотека. Зачем? - PullRequest
6 голосов
/ 17 мая 2010

У меня есть собственный проект C ++ для VS2008, который я хочу скомпилировать как DLL.

Он ссылается только на одну внешнюю библиотеку (log4cplus.lib) и использует ее функции. (естественно, также использует .h файлы log4cplus).

Когда я пытаюсь скомпилировать свой проект как статическую библиотеку, он успешен. Когда я пытаюсь в качестве DLL, он не работает:

1>MessageWriter.obj : error LNK2019: unresolved external symbol "public: static class log4cplus::Logger __cdecl log4cplus::Logger::getInstance(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" (?getInstance@Logger@log4cplus@@SA?AV12@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z) referenced in function "class log4cplus::Logger __cdecl Log(void)" (?Log@@YA?AVLogger@log4cplus@@XZ)

Есть еще 4 ошибки, связанные с функциями в log4cplus.lib.

Кажется, что-то действительно глупое .. пожалуйста, помогите мне:)

Спасибо!

Редактировать:

Я связан с файлом log4cplus.lib, и он находит это просто отлично. Кроме того, log4cplus.lib работает на 100%, я использую его в другом проекте без проблем. Мое первоначальное намерение состояло в том, чтобы скомпилировать мой проект как статическую библиотеку и использовать его в другой DLL, которую я пишу, но когда это происходит, я получаю те же ошибки компоновщика в этом другом проекте ...

Редактировать # 2:

Функции, которые вызывают ошибки компоновщика, являются статическими функциями .. это может быть частью проблемы?

Ответы [ 7 ]

6 голосов
/ 24 июня 2011

Уилкс прав. У меня та же проблема со связью.

Мне понадобился почти один день, чтобы решить эту проблему.

Я скачал log4cplus-1.0.4, после того как я открыл этот проект в Visual Studio 2010, скомпилируйте его, статическую и динамическую библиотеку, без ошибок.

однако, когда я пытаюсь использовать эту библиотеку, у меня возникает ошибка связи, независимо от того, статическая или динамическая библиотека.

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

оба unicode или оба многобайтовых набора символов.

и изменить кодировку одного проекта в visual studio 2010, см. следующую ссылку.

Как отключить Unicode в проекте VC ++?

4 голосов
/ 17 мая 2010

Когда вы создаете статическую библиотеку, создатель библиотеки не пытается разрешить все функции, которые вы используете (те, которые находятся в log2cplus.lib). Эти функции разрешаются, когда вы создаете исполняемый файл, который связывается с вашей статической библиотекой.

Когда вы создаете динамическую библиотеку, создатель библиотеки (компоновщик) пытается разрешить все функции, которые вы используете. Вы должны предоставить компоновщику библиотеку log4cplus.lib, как только вы создадите динамическую библиотеку. Вы не можете ждать, пока не создадите исполняемый файл.

3 голосов
/ 17 мая 2010

В любом случае вам нужно связываться с библиотекой.

Разница в том, что при статической ссылке - все функции связаны с помощью используемой вами библиотеки.

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

Редактировать:

Я видел, что отсутствующий символ не является __imp ... Это означает, что файл заголовка не «настроен» для динамического связывания, возможно, из-за того, что у вас не определено LOG4CPLUS_BUILD_DLL или log4cplus_EXPORTS или DLL_EXPORT в проекте, в который включены заголовки Log4Cplus.

2 голосов
/ 17 мая 2010

Вы действительно связываетесь с файлом log2cplus.lib? Если бы вы компилировали как статическую библиотеку, вы бы связались с ней через финальный .exe, а не в статической библиотеке - возможно, в этом разница?

0 голосов
/ 18 мая 2010

Существует две возможности для ошибки компоновщика:

  1. Вы скомпилировали log4cplus.dll (и связанную библиотеку импорта log4cplus.lib), используя предоставленную конфигурацию сборки выпуска, но теперь ваше приложение скомпилировано с опцией «Набор символов», установленной на «Использовать набор символов Юникода»

  2. Или вы пытаетесь использовать статическую библиотеку log4cplus, но определяете LOG4CPLUS_BUILD_DLL для своего приложения.

Бьюсь об заклад на номер 1. Это может быть что-то еще, все же. Какую версию log4cplus вы используете?

Если вы хотите использовать log4cplus.dll в вашем приложении, определите символ LOG4CPLUS_BUILD_DLL. log4cplus_EXPORTS и DLL_EXPORT предназначены только для поддержки системы сборки на основе CMake и системы сборки на основе autotools в MingGW соответственно.

0 голосов
/ 17 мая 2010

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

0 голосов
/ 17 мая 2010

Вы использовали __declspec (dllimport) и __declspec (dllexport)?

Они не обязательны при связывании статических библиотек, но обязательны для DLL. Функция должна быть объявлена ​​для экспорта (в DLL), чтобы пользователи могли использовать ее снаружи (и, следовательно, импортировать ее из DLL).

Может быть, это может помочь:

Импорт в приложение с помощью __declspec (dllimport)

http://msdn.microsoft.com/en-us/library/8fskxacy%28VS.80%29.aspx

С наилучшими пожеланиями

...