вынудите Visual Studio связать все символы в библиотечном файле

Самый проголосовавший ответ был отличным и полезен около 7 лет. С введением C # 6.0 и, в частности, String Interpolation есть более аккуратный и более безопасный способ IMO, чтобы сделать то, что было задано to add commas in thousands place for a number:

var i = 5222000;
var s = $"{i:n} is the number"; // results to > 5,222,000.00 is the number
s = $"{i:n0} has no decimal"; // results to > 5,222,000 has no decimal

Если переменная i установлена ​​на место (т. е. {0}). Поэтому нет необходимости помнить, какой объект переходит в какую позицию. Форматирование (т. Е. :n) не изменилось. Для получения полной информации о том, что нового, вы можете перейти на эту страницу .

23
задан Lodle 22 May 2009 в 09:04
поделиться

3 ответа

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

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

Что-то вроде:

#define FORCE_LINK_THIS(x) int force_link_##x = 0;

#define FORCE_LINK_THAT(x) { extern int force_link_##x; force_link_##x = 1; }

Это не совсем элегантно, но мы не нашли лучшего решения, которое работает на разных платформах.

21
ответ дан Andrew Grant 29 November 2019 в 02:46
поделиться

У меня была такая же проблема с системой плагинов, где фабрики в различных DLL-библиотеках использовали общую основную фабрику, все регистрировалось при запуске при загрузке библиотек, без необходимости составлять список плагинов для использования. Это работало очень хорошо в Linux, но в Windows было две проблемы:

  1. фабрики не были обычными для DLL. Это не ваша проблема, но это связано. Я получил решение здесь: Обеспечение использования общих жиров . Посмотрите на ответ Джеймса с помощью функции set_the_global.
  2. они не были настроены при запуске, если в основном не использовался символ DLL. Я думаю, что это твоя проблема. Единственным решением, которое я нашел, было использование файлов конфигурации (по подпроектам), в которых перечислены имена доступных плагинов (DLL), и принудительно их связывание с использованием, в моем случае, QLibrary. Используя cmake, версия конфигурации по умолчанию для каждого подпроекта генерируется во время сборки с использованием следующего макроса, который вызывается вместо add_library в каждом плагине dir:

    file(WRITE ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-plugins "")
    macro (DECLARE_AMOSE_PLUGIN _plugin)
      file (APPEND ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-plugins "${_plugin}\n")
      add_library(${_plugin} SHARED ${${_plugin}_LIB_SRCS})
    endmacro (DECLARE_AMOSE_PLUGIN)
    
1
ответ дан Community 29 November 2019 в 02:46
поделиться

Как DLL собирается вызвать функции от Вашего lib во времени выполнения? Это звучит немного твердым верить.

Теперь, если пользователи DLL собираются назвать Ваши библиотечные функции, Ваш вопрос имеет смысл. Компиляторы Windows (в отличие от компиляторов Unix) только экспортируют функции из DLL, если явно требуется. Наиболее распространенный способ сделать это должно объявить функцию "dllexport", но можно также назвать функции в.DEF файле как передача это компоновщику. Обратите внимание, что необходимо перечислить скорректированное имя C++ в.DEF файле.

-1
ответ дан MSalters 29 November 2019 в 02:46
поделиться
Другие вопросы по тегам:

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