Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, zaufi, Вы писали:
Z>>именно так и сделано тут!
Z>>все регистрируемые классы находятся в отдельной единице трансляции, которая и составляет библиотеку.
Z>>в исполняемом модуле ничего этого не видно, ни процедуры регистрации, ни даже типов регистрируемых классов!
BZ>у тебя main явно вызывавет функцию, определённую в библиотеке:
BZ>main()
BZ>#ifdef COMPILE_AS_STATIC
BZ> test::access_registry_indirectly_mt();
BZ>благодаря этому цепляется obj-файл, в котором она определена. если таких obj-файлов много, то придётся вызывать функцию в каждом из них
ок. разделил библиотеку на 2 файла (объектника):
код регистрации и
доступ к реестру (
в main'a используюется функция только из этой единицы трансляции!).
BZ>ps: и извини, неужели ты не можешь сделать пример на 10-20 строчек и собрать его явно без смаке?
извини, как ты себе представляешь код на 10-20 строчек, при том, что участвует 2 единицы трансляции (для формирования библиотеки) + 1 header (для того, чтобы main знал про реестр) + собственно код исполняемого файла, пытающийся использовать указанную библиотеку...
BZ>думаешь охота разбираться в километрах кода и логов? boost, вот это всё. ведь очень просто:
я могу написать на `make` -- CMake просто для того, чтобы на убогих платформах можно было сгенерить файл проекта для самой лучшей IDE в мире...
BZ>lib.c: int a=printf("lib.c\n");
BZ>main.c: main(){}
BZ>слинкуй lib.c как obj/lib файл и ты увидишь разницу. а дальше пробуй конструкторы и т.д.
ну а я что делаю??? static_xtors_lib.cc и static_xtors_lib_access.cc транслируются в .o, и далее из них собирается библа (.a, или .lib, по вашему) -- в чем я должен увидеть разницу?
линковка объектников напрямую к исполняемому файлу, очевидно работает. я сделал (кроссплатформенную) демку (не потратив на это кучу времени, спасибо CMake) показывающую, что в случае со статическими и тем более динамическими библами тоже все работает... какие еще остались вопросы?