Связывание объектных файлов, созданных с использованием разных версий GCC - PullRequest
10 голосов
/ 17 января 2011

У меня есть некоторые проблемы совместимости при создании библиотеки C ++ с современной версией GCC 4.4.x / 4.5.x, в связи с чем клиенты в более старой версии, например, 3.4.x / 4.1.x Одним из предложенных решений является компиляция объектных файлов и их распространение. Клиенты могут затем ссылаться, используя любую версию GCC и соответствующий ABI. Некоторые вопросы:

  1. Это правильно?
  2. Стоит ли использовать статические ссылки, чтобы избежать проблем совместимости с libstdc ++?
  3. Является ли это ненужным (я слышал, что gcc 3.4 и выше совместим с прямой совместимостью)?

Cheers, Graeme

Ответы [ 2 ]

7 голосов
/ 17 января 2011

Самым безопасным было бы дать им .so и соответствующий ему заголовок со стабильным двоичным API. Чтобы быть бинарно стабильным, этот API не должен принимать или возвращать любые типы std::, такие как std::string или std::vector<>, поскольку двоичная компоновка типов std:: может изменяться от версии к версии.

И он должен быть статически связан с libstdc ++ и libgcc_s, чтобы вашим клиентам не приходилось связываться с определенной версией libstdc ++.

Вы также можете упаковать все свои файлы .o в один .a для удобства, чтобы при добавлении нового файла .o вашим клиентам не приходилось обновлять свои make-файлы для связи с новым .o.

1 голос
/ 17 января 2011

AFAIK, связывание должно быть сделано с последней версией.

См. http://gcc.gnu.org/onlinedocs/gcc/Compatibility.html

и http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

для соответствующей документации gcc.

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