Использование DLL, которая ссылается на статическую библиотеку - PullRequest
0 голосов
/ 06 декабря 2010

Я пытаюсь создать решение в Visual C ++, где у меня есть внешний интерфейс, который ссылается на проект DLL, который я создал. В проекте DLL я ссылаюсь на статическую библиотеку (которую я не написал), которая имеет статические объекты и определения. Все хорошо, но у меня проблемы с компоновкой.

У меня есть пара вопросов. Во-первых, я должен получать неразрешенные символы только для объектов, на которые я ссылаюсь в интерфейсе, которые не экспортируются, верно? Я хочу, чтобы библиотека DLL была единственным интерфейсом к статической библиотеке и не имела прямой ссылки на какую-либо ее часть во внешнем интерфейсе, и все же я получаю ряд неразрешенных символов из этой библиотеки. Там символы кажутся включенными и, по крайней мере, некоторые из них не связаны напрямую с проектом DLL. Я подозреваю, что это связано со статическими объявлениями в статической библиотеке, но как я могу справиться с ними?

Некоторые из неразрешенных ошибок символов:

2>AnalysisVis.obj : error LNK2001: unresolved external symbol "public: __thiscall SharkException::SharkException(char const *,int,char const *)" (??0SharkException@@$$FQAE@PBDH0@Z)
2>AnalysisVis.obj : error LNK2001: unresolved external symbol "public: static class Bernoulli Rng::coinToss" (?coinToss@Rng@@2VBernoulli@@A)
2>AnalysisVis.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall ChromosomeT<bool>::operator<(class Chromosome const &)const " (??M?$ChromosomeT@_N@@$$FUBE_NABVChromosome@@@Z)

1 Ответ

0 голосов
/ 06 декабря 2010

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

>pushd <path_to_msvc_dir>\Microsoft Visual Studio X.0\VC\bin
>dumpbin /all [static_lib_path] > out.txt
>type out.txt | find /I "SharkException"
>type out.txt | find /I "coinToss"
>type out.txt | find /I "ChromosomeT"

Кстати, библиотека DLL, которая использует статическую lib, компилируется чистотот же компилятор, что и ваше приложение / решение?

...