Как заставить gcc ссылаться как g ++? - PullRequest
4 голосов
/ 17 августа 2011

В этом эпизоде ​​«давайте будем глупы» у нас возникает следующая проблема: библиотека C ++ была обернута слоем кода, который экспортирует свою функциональность таким образом, чтобы ее можно было вызывать из C. Это приводит к отдельная библиотека, которая должна быть связана (вместе с исходной библиотекой C ++ и некоторыми объектными файлами, специфичными для этой программы) в программе на C для получения желаемого результата.

Сложность в том, что это делается в контексте жесткой системы сборки, которая была собрана внутри компании и состоит из буквально десятков включаемых make-файлов. Эта система имеет отдельный шаг для связывания библиотек и объектных файлов в конечный исполняемый файл, но она настаивает на использовании gcc для этого шага вместо g ++, потому что все исходные файлы программы имеют расширение .c, поэтому в результате получается множество неопределенных символы. Если командная строка вставляется вручную в командной строке и вместо gcc подставляется g ++, то все работает нормально.

Существует хорошо известная (для этой системы сборки) переменная make, которая позволяет передавать флаги на шаг компоновки, и было бы неплохо, если бы к этой переменной было добавлено заклинание, которое заставило бы gcc вести себя как g ++ (так как обе программы являются драйверами).

Я провел качественное время с документацией gcc, ища что-то, что могло бы сделать это, но не нашел ничего, что выглядит правильно, у кого-нибудь есть предложения?

Ответы [ 3 ]

1 голос
/ 17 августа 2011

Учитывая такую ​​ужасную систему сборки, напишите обертку вокруг gcc, чтобы exec gcc или g++ зависели от аргументов. Замените /usr/bin/gcc этим сценарием или измените PATH, чтобы использовать этот сценарий вместо реального двоичного файла.

#!/bin/sh

if [ "$1" == "wibble wobble" ]
then
  exec /usr/bin/gcc-4.5 $*
else
  exec /usr/bin/g++-4.5 $*
fi
0 голосов
/ 17 августа 2011

Большое спасибо bmargulies за его комментарий к исходному вопросу. Сравнивая результаты запуска строки ссылки с gcc и g ++ с помощью опции -v и немного поэкспериментировав, я смог определить, что «-lstdc ++» был магическим ингредиентом, который нужно добавить в мои флаги связывания (в соответствующем порядок относительно других библиотек), чтобы избежать проблемы неопределенных символов.

Для тех из вас, кто хочет играть в «давайте будем глупыми» дома, я должен отметить, что я избегал любого использования статической инициализации в коде C ++ (как это обычно бывает), поэтому я не был вынужден компилировать модуль перевода, содержащий функцию main () с g ++, как указано в пункте 32.1 FAQ-Lite (http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html).

0 голосов
/ 17 августа 2011

Проблема заключается в том, что связывание C создает объектные файлы с искажением имен C, а связывание C ++ создает объектные файлы с искажением имен C ++.

Лучше всего использовать внешний "C" перед объявлениями в ваших сборках C ++ и без префиксов в ваших сборках C.

Вы можете обнаружить C ++, используя

#if __cplusplus
...