static variable + static link
От: dad  
Дата: 04.06.15 09:51
Оценка:
приветствую!

в библиотеке в cpp файле объявлен статический объект:

static Object okey = Object();


конструктор которого делает некую функциональность.
при динамической линковке библиотеки он создается,
при статической — нет. в чем проблема?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: static variable + static link
От: Chorkov Россия  
Дата: 04.06.15 10:00
Оценка:
Здравствуйте, dad, Вы писали:

dad>приветствую!


dad>в библиотеке в cpp файле объявлен статический объект:


dad>
dad>static Object okey = Object();
dad>


dad>конструктор которого делает некую функциональность.

dad>при динамической линковке библиотеки он создается,
dad>при статической — нет. в чем проблема?

Вероятно в единице трансляции, в которой объявлен okey,
не определены больше никакие объекты/функции (используемые
в других единицах трансляции)?

При статической линковке, линкер может выкинуть *.obj файлы из состава *.lib,
если в нем не определены никакие используемые символы.
Re: static variable + static link
От: dad  
Дата: 04.06.15 10:03
Оценка:
забыл написать — gcc (другие не проверял)
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[2]: static variable + static link
От: dad  
Дата: 04.06.15 10:05
Оценка:
C>Вероятно в единице трансляции, в которой объявлен okey,
C>не определены больше никакие объекты/функции (используемые
C>в других единицах трансляции)?

ну да — это реализация внешнего интерфейса, которая дергает внешнюю функцию.
есть какие-либо идеи/флаги ?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: static variable + static link
От: Ops Россия  
Дата: 04.06.15 10:06
Оценка:
Здравствуйте, dad, Вы писали:

dad>конструктор которого делает некую функциональность.

dad>при динамической линковке библиотеки он создается,
dad>при статической — нет. в чем проблема?

Тут объяснение:
http://stackoverflow.com/questions/9459980/c-global-variable-not-initialized-when-linked-through-static-libraries-but-ok

Если этот объект нигде в коде не используется, линкер его выкидывает при оптимизации.
Можно использовать /OPT:NOREF, если тебя это устраивает
Можно
#pragma comment(linker, "/include:okey")
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: static variable + static link
От: dad  
Дата: 04.06.15 10:26
Оценка:
Ops>Тут объяснение:
Ops>http://stackoverflow.com/questions/9459980/c-global-variable-not-initialized-when-linked-through-static-libraries-but-ok


да — видал. это для vc. для gcc пока не помогло то что там есть.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: static variable + static link
От: Evgeny.Panasyuk Россия  
Дата: 04.06.15 10:28
Оценка: +1
Здравствуйте, dad, Вы писали:

dad>при динамической линковке библиотеки он создается,

dad>при статической — нет. в чем проблема?

http://rsdn.ru/forum/cpp/5140189.flat.1
Автор: Evgeny.Panasyuk
Дата: 17.04.13
Re[2]: static variable + static link
От: dad  
Дата: 04.06.15 10:40
Оценка:
EP>http://rsdn.ru/forum/cpp/5140189.flat.1
Автор: Evgeny.Panasyuk
Дата: 17.04.13


спасибо. но хотелось бы быть твердо уверенным, что это не рашается с помощью флагов.
-Wl,--whole-archive — дает еще больше проблем.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[3]: static variable + static link
От: Evgeny.Panasyuk Россия  
Дата: 04.06.15 10:43
Оценка: +1
Здравствуйте, dad, Вы писали:

EP>>http://rsdn.ru/forum/cpp/5140189.flat.1
Автор: Evgeny.Panasyuk
Дата: 17.04.13

dad>спасибо. но хотелось бы быть твердо уверенным, что это не рашается с помощью флагов.
dad>-Wl,--whole-archive — дает еще больше проблем.

Как вариант вместо статической библиотеки можно линковать объектный файл
Автор: Evgeny.Panasyuk
Дата: 17.04.13
.
Re[4]: static variable + static link
От: dad  
Дата: 04.06.15 10:47
Оценка:
EP>Как вариант вместо статической библиотеки можно линковать объектный файл
Автор: Evgeny.Panasyuk
Дата: 17.04.13
.


да. печально. за ответ спасибо!
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[3]: static variable + static link
От: Ops Россия  
Дата: 04.06.15 11:01
Оценка: +1
Здравствуйте, dad, Вы писали:

dad>да — видал. это для vc. для gcc пока не помогло то что там есть.


Так а либа твоя? А то пишут про атрибут:

used
    This attribute, attached to a variable, means that the variable must be emitted even if it appears that the variable is not referenced.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: static variable + static link
От: dad  
Дата: 04.06.15 11:17
Оценка:
Ops>Так а либа твоя? А то пишут про атрибут:

Ops>
Ops>used
Ops>    This attribute, attached to a variable, means that the variable must be emitted even if it appears that the variable is not referenced. 
Ops>


не — не помогает. либа моя — потому напишу обвязку с extern функциями регистрации плагинов. лучше явно чем танцы с объектниками.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[5]: static variable + static link
От: Ops Россия  
Дата: 04.06.15 11:49
Оценка:
Здравствуйте, dad, Вы писали:

dad>не — не помогает. либа моя — потому напишу обвязку с extern функциями регистрации плагинов. лучше явно чем танцы с объектниками.


Ну вообще сама идея полагаться на сайд-эффекты глобальных переменных как-то не очень. Тем более, при статической линковке ты еще при сборке знаешь, что будешь подключать.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[6]: static variable + static link
От: dad  
Дата: 04.06.15 11:51
Оценка:
Ops>Ну вообще сама идея полагаться на сайд-эффекты глобальных переменных как-то не очень. Тем более, при статической линковке ты еще при сборке знаешь, что будешь подключать.

все в программировании один большой сайд-эффект.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: static variable + static link
От: MTimur  
Дата: 10.06.15 19:28
Оценка:
Здравствуйте, dad, Вы писали:
  Скрытый текст
dad>приветствую!

dad>в библиотеке в cpp файле объявлен статический объект:


dad>
dad>static Object okey = Object();
dad>


dad>конструктор которого делает некую функциональность.

dad>при динамической линковке библиотеки он создается,
dad>при статической — нет. в чем проблема?

Object &Get()
{
    static Object okey = Object();
    return okey;
}


Если функция Get будет в списке экспорта, все должно слинковаться.
Отредактировано 10.06.2015 19:29 MTimur . Предыдущая версия .
Re[2]: static variable + static link
От: icWasya  
Дата: 11.06.15 06:27
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>Здравствуйте, dad, Вы писали:

MT>
  Скрытый текст
dad>>приветствую!

dad>>в библиотеке в cpp файле объявлен статический объект:


dad>>
dad>>static Object okey = Object();
dad>>


dad>>конструктор которого делает некую функциональность.

dad>>при динамической линковке библиотеки он создается,
dad>>при статической — нет. в чем проблема?

MT>
MT>Object &Get()
MT>{
MT>    static Object okey = Object();
MT>    return okey;
MT>}
MT>


MT>Если функция Get будет в списке экспорта, все должно слинковаться.

Только в этом случае объект будет создан при первом вызове функции,
а пор сабжу он должен создаваться автоматически
Re[3]: static variable + static link
От: MTimur  
Дата: 11.06.15 08:21
Оценка: -1
Здравствуйте, icWasya, Вы писали:

W>Здравствуйте, MTimur, Вы писали:

MT>>Если функция Get будет в списке экспорта, все должно слинковаться.
W>Только в этом случае объект будет создан при первом вызове функции,
W>а пор сабжу он должен создаваться автоматически

DllMain?
Re[4]: static variable + static link
От: dad  
Дата: 15.06.15 08:48
Оценка:
Ops>Так а либа твоя? А то пишут про атрибут:

И хотя я уже переписал — сработало банальное volatile:

http://rsdn.ru/forum/trash/6078041

Слона-то я и не приметил! Интересно — будет работать с другими компиляторами?
Кто перенес сообщение в мусор — не понятно. Даже спасибо не сказать.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[5]: static variable + static link
От: Dair Россия http://dair.spb.ru
Дата: 15.06.15 09:11
Оценка:
Здравствуйте, dad, Вы писали:

dad>И хотя я уже переписал — сработало банальное volatile:

dad>http://rsdn.ru/forum/trash/6078041

dad>Слона-то я и не приметил! Интересно — будет работать с другими компиляторами?

dad>Кто перенес сообщение в мусор — не понятно. Даже спасибо не сказать.

Я сам и перенес. Выяснил, что на самом деле не работает (у меня в тестовом примере) Поэтому потёр, чтобы не позориться.
Хотя мысль про volatile возникла первой.
С уважением,
Владимир Лебедев-Шмидтгоф
Санкт-Петербург, РФ.
Re[6]: static variable + static link
От: dad  
Дата: 15.06.15 09:16
Оценка:
D>Я сам и перенес. Выяснил, что на самом деле не работает (у меня в тестовом примере) Поэтому потёр, чтобы не позориться.
D>Хотя мысль про volatile возникла первой.

У меня сработало ...
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[6]: static variable + static link
От: dad  
Дата: 15.06.15 09:37
Оценка:
> что на самом деле не работает

что не работает-то? в релизе?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[3]: static variable + static link
От: greenpci  
Дата: 16.06.15 10:33
Оценка:
Здравствуйте, dad, Вы писали:

dad>спасибо. но хотелось бы быть твердо уверенным, что это не рашается с помощью флагов.

dad>-Wl,--whole-archive — дает еще больше проблем.

а в чем проблема? Надо обернуть линковку библиотеки в -Wl,--whole-archive <библиотека> -Wl,--no-whole-archive. Тогда берется все содержимое этой конкретной библиотеки, а остальные зависимости линкуются как обычно — избирательно. И при такой линковке конструктор будет вызван.

g++ -Wl,--whole-archive ../test_lib/libL.a -Wl,--no-whole-archive main.cpp
Re[4]: static variable + static link
От: dad  
Дата: 16.06.15 10:39
Оценка:
G>а в чем проблема? Надо обернуть линковку библиотеки в -Wl,--whole-archive <библиотека> -Wl,--no-whole-archive. Тогда берется все содержимое этой конкретной библиотеки, а остальные зависимости линкуются как обычно — избирательно. И при такой линковке конструктор будет вызван.

G>
G>g++ -Wl,--whole-archive ../test_lib/libL.a -Wl,--no-whole-archive main.cpp
G>


пробовал — масса ошибок. Проект сложный, библиотек много, cmake, и в конечном счете библиотека сама линкуется в ExternalProject у зависимости модуля прописываются через внешний файл.
выставить флаг на отдельный файл — не пробовал.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[5]: static variable + static link
От: greenpci  
Дата: 16.06.15 10:53
Оценка: 6 (1)
Здравствуйте, dad, Вы писали:

dad>пробовал — масса ошибок. Проект сложный, библиотек много, cmake, и в конечном счете библиотека сама линкуется в ExternalProject у зависимости модуля прописываются через внешний файл.


Так и должно быть. У тебя будет куча повторяющихся символов. Нужно только один файл обернуть.

dad>выставить флаг на отдельный файл — не пробовал.


Попробуй.
Re[6]: static variable + static link
От: dad  
Дата: 16.06.15 11:43
Оценка: :)
D>Я сам и перенес. Выяснил, что на самом деле не работает (у меня в тестовом примере) Поэтому потёр, чтобы не позориться.
D>Хотя мысль про volatile возникла первой.

действительно не работает — из-за привнесенного наведенного бага либа собиралась как shared — а я обрадовался ))
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[6]: static variable + static link
От: dad  
Дата: 16.06.15 12:57
Оценка:
G>Попробуй.

сработало. но пришлось в нескольких местах файлы сборки править для cmake и для внешнего приложения и для тестов.
зато код лишний выпилил )
пока оставлю так, но конечном счете, думаю оставлю обвязку с явным вызовом — слишком грязный хак.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.