Что такое Microsoft Visual Studio, эквивалентная опции GCC ld – whall-archive

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

В Unix, где мы используем gcc, я могу передать флаг – whole-archive в компоновщик ld (см. Выдержку из документации ld ниже), что делает ld не отбрасывать какие-либо объекты. Есть ли что-то подобное для Visual C ++?

–whole-архив

Для каждого архива, указанного в командной строке после
Опция `–whole-archive ‘включает в себя каждый объектный файл в архиве
в ссылке, вместо поиска в архиве требуемого
объектных файлов. Обычно это используется для преобразования архивного файла в
разделяемой библиотеки, заставляя каждый объект быть включенным в
в результате общая библиотека. Эта опция может использоваться несколько раз.

    Насколько мне известно, нет единственного варианта, который надежно гарантирует это. Есть комбинации оптимизирующих опций, которые (молча) дезактивируют это, так что никоим образом … /INCLUDE работает, но для этого вам нужно извлечь и перекодировать искаженное имя символа. У вас есть два варианта: (1) обеспечить, чтобы все регистраторы содержались (включены) в блок переводов, содержащий main и обеспечивающие их использование. (2) Откажитесь от этой «идиомы» и используйте явную регистрацию.

    Внимание: этот ответ сейчас почти 7 лет, и утверждения относительно доступности опций в инструментальной цепочке MSVC ++ устарели. Тем не менее я по-прежнему рекомендую не полагаться на шаблон регистратора и смотреть на альтернативы. Из-за этой рекомендации, пожалуйста, не стесняйтесь голосовать, но я думаю, что это немного несправедливо, потому что этот вариант был добавлен к компоновщику Microsoft тем временем.

    Версия Visual C ++ в Visual Studio 2015 Update 2 включает новый флаг в link.exe называемый /WHOLEARCHIVE , который имеет эквивалентную функциональность --whole-archive для ld . Согласно документации по флагом :

    Параметр /WHOLEARCHIVE заставляет компоновщик включать каждый объектный файл из заданной статической библиотеки или, если не указан никакой библиотеки, из всех статических библиотек, указанных в команде LINK.

    Я считаю, что ближайший эквивалент будет /OPT:NOREF .

    Я использую / INCLUDE: для принудительного включения неиспользуемых символов.

    Вы можете использовать с CMake как:

     add_executable(hello ${SOURCE_FILES}) target_link_libraries(hello libA libB libC) # Not need /wholearchive libC set_target_properties(hello PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:libA /WHOLEARCHIVE:libB") 

    Примечание: /WHOLEARCHIVE доступен только для Visual Studio 2015 Update 2+

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

    В CMake это можно сделать так:

     add_library(common OBJECT ${common_sources}) add_executable(executable1 "main1.cc" $ add_executable(executable2 "main2.cc" $ 

    Изменение любого из файлов в ${common_sources}) только перекомпилирует их эквивалентные объекты и перехватывает исполняемые файлы, что дает те же преимущества, что и вы связали вещи через промежуточный .lib . В то же время все статические конструкторы остаются на месте, что решает проблему.

    Обратите внимание, что это полезно, если вы ставите ссылку на вещи статически.

    Этот подход был протестирован с помощью gcc 5.2.0, MinGW-w64 5.2.0 и MSVC 15.

    На странице свойств исполняемого файла на вкладке Общие свойства / Ссылки / Использовать вкладки зависимостей библиотеки установлено значение true. Это в значительной степени эквивалент MS -все-архив в двух словах.

    Изменить: Однако соответствующая библиотека должна быть частью решения.

    Interesting Posts

    В чем разница между atan и atan2 в C ++?

    Забыл пароль ключа, думая об обнаружении Брута-Силы. будет ли он испортить хранилище ключей?

    Как файловые системы обрабатывают одновременное чтение / запись?

    Циклы в программном обеспечении семейства деревьев

    Windows 7 Pro x64, страдающий бессонницей

    В ядре CUDA, как мне хранить массив в «локальной памяти streamа»?

    Как удалить другую операционную систему Windows, когда у меня есть два

    Создание шкалы Viewbox по вертикали, но растяжение по горизонтали

    Плавающая точка и целочисленные вычисления на современном оборудовании

    Почему конструкторы не возвращают значения?

    Как преобразовать данные, полученные через Meteor.publish?

    Класс эквивалентен методу -ответчик для выбора:

    как эмулировать «insert ignore» и «on duplicate key update» (sql merge) с postgresql?

    Расширьте Linux Desktop до другого экрана X Windows

    Как преобразовать объект org.w3c.dom.Document в String?

    Давайте будем гением компьютера.