Как заставить создание глобального объекта в статически связанной библиотеке? [MSVC9] - PullRequest
2 голосов
/ 28 марта 2010

У меня есть глобальный список указателей на функции. Этот список должен быть заполнен при запуске. Порядок не важен, и нет никаких зависимостей, которые могли бы усложнить статическую инициализацию. Чтобы облегчить это, я написал класс, который добавляет одну запись к этому списку в своем конструкторе и при необходимости разбрасывает глобальные экземпляры этого класса с помощью макроса. Одной из основных целей этого подхода является устранение необходимости явной ссылки на каждый экземпляр этого класса извне, вместо этого позволяя каждому файлу, который должен что-то зарегистрировать в списке, сделать это независимо. Красиво и чисто.

Однако при размещении этих объектов в статической библиотеке компоновщик отбрасывает (или, скорее, никогда не связывает) эти блоки, поскольку на них явно не ссылается ни один код. Явная ссылка на символы в единицах компиляции будет контрпродуктивной, прямо противоречащей одной из основных целей подхода. По той же причине / INCLUDE не является приемлемым параметром, и / OPT: NOREF фактически не связан с этой проблемой.

Для Metrowerks есть директива __declspec, в GCC - -force_load, но я не могу найти эквивалент для MSVC.

Ответы [ 2 ]

0 голосов
/ 28 марта 2010

Я думаю, что вы хотите пару #pragma optimize("", off) и #pragma optimize("", on) вокруг этих объявлений переменных. Это отключит оптимизацию, которая их отбрасывает.

Также помните, что директивы препроцессора не могут быть частью макросов. __pragma может использоваться для некоторых вещей (и предназначен специально для использования в макросах), но не для всего, и синтаксис немного отличается. Не уверен, работает ли он с оптимизацией.

0 голосов
/ 28 марта 2010

Если вы не хотите #include что-либо, тогда это не сработает, но если вы можете с этим смириться, обычная техника - использовать отличный счетчик для вызова функции объявляется в файле cpp перед main, что затем инициализирует любые статические объекты в указанном файле.

Я использовал это в проектах, в которых было много объектов, которые должны быть отправлены на завод. У нас должен был быть один файл с #include каждым заголовком, в котором объявлен класс, который должен зарегистрироваться на фабрике. Это разумно выполнимо ИМХО, поскольку я настоятельно предпочитаю писать исходные файлы, а не устанавливать различные параметры компоновщика / компилятора.

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

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