Статически связанные библиотеки не запускают код внутри для установки статических переменных - PullRequest
2 голосов
/ 18 июня 2010

В проекте c ++, над которым я работаю, у меня есть простой файл c ++, который должен запускать некоторый код в начале выполнения программы. Этот файл связан со статической библиотекой, которая затем связана с основной программой.

У меня аналогичный код в других файлах, работает нормально, это выглядит примерно так:

bool ____nonexistent_value = executeAction();

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

Обновление (решение):

Пока создание общих, а не статических библиотек заставляет все работать. Позже я рассмотрю все, что связано со статическими библиотеками. Спасибо всем за помощь!

Ответы [ 3 ]

2 голосов
/ 18 июня 2010

Если в этом конкретном файле нет ссылки на символ, файл не будет включен компоновщиком. У вас есть два варианта:

  1. Удалите файл из библиотеки и включите его (объектный или исходный файл) непосредственно в командную строку для компиляции / компоновки. Затем файл должен быть включен в исполняемый файл.
  2. Если в файле есть символ, на который вы ссылаетесь из других файлов (например, с определением main ()), он должен "вытягивать" файл во время связывания.
1 голос
/ 18 июня 2010

Я не уверен, есть ли способ гарантировать такое статическое размещение в статической библиотеке, но вы всегда можете сделать это явным.Предоставьте функцию init для вашей библиотеки, которая будет вызываться из main для настройки всего, что вам нужно.Таким образом, вам не нужно беспокоиться о пропуске компоновщиками кода, который явно не используется, и т. Д.

0 голосов
/ 18 июня 2010

Там нет гарантированного заказа для статической инициализации.Вы хотите быть очень осторожным с этим!

...