Проект C++ компилирует как статический lib, сбои (ошибка компоновщика) как динамический lib. почему?

У меня есть собственный проект 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:

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

6
задан Roey 17 May 2010 в 12:41
поделиться

6 ответов

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

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

Возможно, это поможет:

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

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

с уважением

0
ответ дан 8 December 2019 в 15:59
поделиться

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

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

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

Правка:

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

3
ответ дан 8 December 2019 в 15:59
поделиться

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

0
ответ дан 8 December 2019 в 15:59
поделиться

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

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

4
ответ дан 8 December 2019 в 15:59
поделиться

Есть две возможности, которые я вижу для ошибки компоновщика:

  1. Вы скомпилировали log4cplus.dll (и связанную с ней библиотеку импорта log4cplus.lib), используя предоставленную конфигурацию сборки Release, но теперь ваше приложение скомпилировано с опцией "Character Set", установленной на "Use Unicode Character Set"

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

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

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

0
ответ дан 8 December 2019 в 15:59
поделиться

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

.
2
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: