Библиотеки ссылок с зависимостями в Visual C++, не получая LNK4006

double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));
21
задан abatishchev 27 February 2009 в 15:55
поделиться

8 ответов

Насколько я знаю, что Вы не можете отключить предупреждения компоновщика. Однако можно проигнорировать некоторых из них, с помощью параметра командной строки компоновщика, например,/ignore:4006

, Помещенного это в свойства проекта при компоновщике-> установка командной строки (не помните точное местоположение).

Также читает это:

Ссылка / игнорируют

Форум MSDN - скрывающий предупреждения LNK

Wacek

12
ответ дан 29 November 2019 в 21:47
поделиться

Microsoft (R) Incremental Linker Version 9.00.x ( link.exe ) знает аргумент /ignore:4006

3
ответ дан 29 November 2019 в 21:47
поделиться

Вы могли создать одну библиотеку, которая содержит A, B, C & D и затем связываются X против этого.

, Так как это - библиотека, только объектные модули, на которые на самом деле ссылаются, будут связаны в заключительный исполняемый файл.

3
ответ дан 29 November 2019 в 21:47
поделиться

Я думаю, что лучший план действий здесь должен будет игнорировать/запрещать предупреждения компоновщика (LNK4006), так как C.lib должен быть частью и A.Lib и B.lib, и A.Lib не должен знать, что сам B.lib использует C.Lib.

0
ответ дан 29 November 2019 в 21:47
поделиться

Проблема - Вы, не локализуют символы библиотеки C. Таким образом, у Вас есть нарушение ODR, когда Вы связываетесь в A и B. У Вас должен быть способ сделать их частными. По умолчанию все символы экспортируются. Один способ сделать это должно иметь специальный файл определения компоновщика и для A и для B, которые явно упоминают, какие файлы должны быть экспортированы.

[1] ODR = Одно Правило Определения.

0
ответ дан 29 November 2019 в 21:47
поделиться

Обновление , Если можно разработать весь включенный проект в едином решении, попробуйте это:

  • Помещенный весь проект в один sln.
  • Удаляют все ссылки на статические библиотеки от свойств компоновщика или библиотекаря проектов.
  • существует опция "Project Dependencies..." в контекстном меню для каждого проекта в Проводнике Решения. Используйте его для определения зависимостей между проектом.

Это должно работать. Это не делает недействительным ничего, что я сказал прежде, базовая модель создания программ C/C++ остается такой же. VS (по крайней мере, 2005 и более новый) просто достаточно умен для добавления всех необходимых статических библиотек к командной строке компоновщика. Вы видите его в свойствах проекта.

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

<час>

я не думаю, что можно сделать что-либо об этом. Необходимо удалить ссылки на другие помехи, освобождает от помех, освобождает проекты, и добавьте, что все необходимые помехи освобождают проекты как зависимости exe или dll проектов. Необходимо будет просто жить с тем, что любой проект, который включает A.lib или B.lib также, должен включать C.lib.

Как альтернатива можно превратить библиотеки в dlls, которые предоставляют более богатую модель.

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

библиотека Static является просто архивом скомпилированных и еще кода связанного объекта. Это не последовательное целое. Каждый объектный файл компилируется отдельно и остается отдельным объектом в библиотеке. Соединение происходит при создании exe или dll. Именно тогда необходимо предоставить весь объектный код. Именно тогда весь символ и зависимость, решающая, происходят.

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

8
ответ дан 29 November 2019 в 21:47
поделиться

Это не может зафиксировать Вашу ошибку ссылки, но она могла бы помочь с Вашей проблемой дерева зависимостей.

то, Что я делаю, является просто использованием #pragma для включения lib в .cpp файл, которому нужно оно. Например:

#pragma comment(lib:"wsock32") 

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

-1
ответ дан 29 November 2019 в 21:47
поделиться

Бедный flodin, похоже, разочарован тем, что никто не объяснит, как отключить предупреждения компоновщика. Что ж, у меня была похожая проблема, и в течение многих лет я просто жил с тем фактом, что отображалось несколько сотен предупреждений. Однако теперь, благодаря информации из Link / ignore , я понял, как отключить предупреждения компоновщика.

Я использую Visual Studio 2008. В «Проект» -> «Настройки» -> «Свойства конфигурации» -> «Библиотекарь» -> «Командная строка» -> «Дополнительные параметры» я добавил «/ ignore: 4006» (без кавычек). Теперь мои предупреждения исчезли!

-3
ответ дан 29 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

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