Как предотвратить компоновщик от оптимизации кода запуска?
==========================================================

У меня следующая проблема: Мой (C ++ -) проект состоит из нескольких подпроектов. В каждом из них есть несколько файлов с кодом, который я хочу запустить при запуске. Мое решение до сих пор состоит в том, чтобы использовать статические переменные, которые вызывают соответствующий код при инициализации следующим образом:

При сборке моего проекта с использованием dll для каждого подпроекта все работает нормально, и код выполняется должным образом. Однако при статическом связывании подпроектов компоновщик определяет, что Foo.o не содержит кода, на который когда-либо ссылались извне, и оптимизирует его. Конечно, я мог бы добавить ссылку на sFooRegistry где-нибудь еще, но это утомительно и подвержено ошибкам.

Какие (стандартные совместимые) способы решения этой проблемы существуют?

Хорошо, что я могу сделать на Mac / GCC и Win / Visual Studio?

Не существует стандартных совместимых способов принудительной инициализации объектов в библиотеках - вы должны использовать приемы в зависимости от вашей конкретной платформы (платформ). Разница между DLL и статической библиотекой (по крайней мере, в Windows) состоит в том, что первая имеет код запуска и завершения работы, который выполняется ОС, тогда как последняя представляет собой просто конкатенацию объектных файлов.

Кроме того, компоновщик не оптимизирует ваш стартовый код - он просто не связывает его, потому что он, очевидно, никогда не используется. Линкеры - довольно глупые звери - если вы хотите узнать, как они делают то, что делают, взгляните на книгу[Линкеры & Погрузчики.](http://www.iecc.com/linker/)



Какой-то трюк, но просмотрите его. Для системы Win (но не для Linux) используйте явный dllexport - в этом случае linker doen 't знает, используется ли этот символ внешним приложением или нет.