Связывание статических библиотек в Visual Studio с составными зависимостями - PullRequest
0 голосов
/ 24 ноября 2010

Предположим, у вас есть две статические библиотеки A и B, такие, что A ссылается на методы из B. Возможно ли статически связать исполняемый файл с A и B, чтобы в B не было неразрешенных символов, на которые ссылается A?

Вот моя ситуация:

Когда я пытаюсь все связать таким образом в Visual Studio 2010, между A и B возникают неразрешенные символы, но не между приложением и A. Символы, на которые он жалуется, имеют префикс __imp (которого нет, и не должно существовать в DUMPBIN B). Почему он ищет символы с префиксом __imp, хотя ни одна из библиотек не построена как DLL, и я включил все необходимые «Дополнительные зависимости / каталоги библиотеки» во все проекты? Кроме того, все построено с точно таким же компилятором.

РЕДАКТИРОВАТЬ: Может быть полезно знать, что если библиотека B построена как DLL с библиотекой импорта вместо статической библиотеки, все будет правильно соединено.

РЕДАКТИРОВАТЬ: Я почти уверен, что это не условие препроцессора, вызывающее declspec () или что-то, потому что нет никаких ошибок компоновщика, когда приложение использует B .. только когда A использует B.

ОТВЕТ: Эдвин и JimR верны, на самом деле в заголовке использовался макрос, вызывающий declspec, но я был слишком упрям, чтобы заметить это, когда они впервые упомянули такую ​​возможность. Спасибо, ребята, за ваше терпение.

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

У меня нет MSVS 2010, чтобы посмотреть, так что возьмите это с крошкой соли.

Если символы имеют imp в имени, это означает, что либо есть declspec (dllimport) где-то плавает, (возможно, встроенный в код) переключатель компилятора, заставляющий A рассматривать B как DLL или вы связываете старые вещи, а не то, что в настоящее время создается процессом сборки.

Был липроект, который вы используете, импортирован из более старой версии MSVS?У меня была похожая проблема с плохо управляемым проектом, который был импортирован в MSVS 2008 несколько лет назад ...

В любом случае, внимательно проверьте среду сборки A и убедитесь, что вы ищете прагмы, в которые встроены переключатели компилятора / компоновщика.

3 голосов
/ 24 ноября 2010

зависимости не должны иметь значения!они могут даже быть круглыми, как A refs B и B refs A. Мне кажется (так как вы получаете ошибки компоновщика), что либо у вас нет заголовочных файлов для этих библиотек (вы объявляете funcs из A в B вручную или funcsиз B в A) или файлы заголовков компилируются по-разному в вашей программе и в ваших библиотеках (из-за некоторого параметра #define или компилятора).Используете ли вы одинаковые соглашения о вызовах как в прогах, так и в библиотеках?

1 голос
/ 24 ноября 2010

Поскольку ранее вы использовали lib B в качестве DLL, возможно, что при сборке lib A ваша lib B была еще DLL, а когда вы изменили lib на библиотеку, вы забыли перестроить A.

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