2009-08-24 4 views
1

У меня есть смесь файлов c и C++, компилируемых под g ++. Как объясняется в: What is the difference between g++ and gcc?Миграция g ++ в gcc

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

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

ответ

1

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

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

+1

Нужно указать -lstdC++ для команды компоновщика. – simon

4

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

Whatch for для функций 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

+4

Нужно включить -lstdC++ для команды компоновщика. – simon

0

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

+0

Возможно, я мог бы, но у меня был довольно сложный существующий makefile с источником от третьей стороны, с которой мне не хотелось обезьяны. – simon

1

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 с) использовать оператор new по умолчанию. Строго говоря, вы должны иметь возможность использовать алгоритмы (std::min, std::find_first_of и т. Д.), А также некоторые другие вещи в стандартной библиотеке без -lstdc++, но по большей части вы можете также включить его (компоновщик будет игнорировать любые библиотеки, которые вы на самом деле не ссылаются).

+0

Этот вид имеет смысл.Поскольку вы используете стандартную библиотеку C++ (std :: cout), вы должны обязательно включить ее в командной строке. Реальный вопрос в том, почему вы используете стандартную библиотеку C++ в простой старой C? –

+0

@ Gerco Dries: C и C++ все еще имеют int main. Что вы пытаетесь сказать в своем комментарии? –

+0

@Greco. Вы заметите, что последнее предложение вопроса: «Что -I включает или -L-библиотеки, которые мне нужно добавить в командную строку gcc, что командная строка g ++ включена по умолчанию?» который я понял как «если у меня есть код на C++, и я хочу скомпилировать его с помощью GCC, какие переключатели мне нужно передать для этого?» Итак, да, оба фрагмента программы - это фрагменты C++, и для их компиляции с GCC потребуется добавить переключатель командной строки -lstdC++. –

Смежные вопросы