Миграция g ++ в gcc - PullRequest
       15

Миграция g ++ в gcc

1 голос
/ 24 августа 2009

У меня есть смесь файлов c и c ++, компилируемых под g ++. Как объяснено в: В чем разница между g ++ и gcc?

Файлы c компилируются как c ++ с командной строкой g ++. Не большая проблема, но переход на gcc позволит скомпилировать c-файлы как c-файлы, а c ++-файл - как c ++.

Что -I включает или -L библиотеки мне нужно добавить в командную строку gcc, что командная строка g ++ включает по умолчанию?

Ответы [ 4 ]

4 голосов
/ 24 августа 2009

Вам не нужно добавлять какие-либо включения или библиотеки сверх того, что у вас уже есть.

Остерегайтесь вызова функций C из кода C ++ - вам нужно сообщить компилятору C ++, что это функции C, чтобы программа была правильно связана и работала.

Стандартная практика заключается в добавлении следующих директив для всех ваших заголовков C, включаемых в файлы C ++:

#ifdef __cplusplus
extern "C" {
#endif

... C header contents go here ...

#ifdef __cplusplus
}
#endif

Подробнее здесь: http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

1 голос
/ 25 августа 2009

GCC может определить, на каком языке файл, на основе расширения файла. Тем не менее, GCC автоматически не связывает во время выполнения поддержку для любого языка, кроме C. На практике это означает, что вы можете компилировать программы на C ++, используя gcc вместо g++, но вам нужно добавить директиву -lstdc++:

#include <iostream>

int main()
{
    std::cout << "Hello world\n";
}

g++ hello.cc

gcc hello.cc -lstdc++

Точнее, вам нужно будет указать -lstdc++, если вы используете стандартную библиотеку, исключения, оператор new или RTTI. Например, попробуйте скомпилировать следующее без -lstdc++:

int main()
{
    try {
       throw 1;
    }
    catch (int i)
    {
        return i;
    }
}

Обратите внимание, что контейнеры STL (включая std::string s) по умолчанию используют оператор new. Строго говоря, вы должны иметь возможность использовать алгоритмы (std::min, std::find_first_of и т. Д.) И некоторые другие вещи в стандартной библиотеке без -lstdc++, но по большей части вы могли бы также включить его (компоновщик) будет игнорировать любые библиотеки, на которые вы на самом деле не ссылаетесь).

1 голос
/ 24 августа 2009

Вы не должны добавлять какие-либо. Если он использует C ++, он должен автоматически добавить библиотеки C ++.

Если нет, вам понадобится -lstdc ++ (а если вы все еще получаете неопределенные ссылки, -lc для libc). Не забывайте -lm, если вы используете математические функции.

0 голосов
/ 24 августа 2009

Почему бы не скомпилировать объекты c с помощью gcc и c ++ с помощью g ++, а затем, когда вы ссылаетесь, ссылаться с помощью g ++?

...