2016-10-06 6 views
-4

Когда я работаю над своей IDE (визуальная студия или xCode), я никогда не включаю файлы cpp (только файлы h), и все прекрасно компилируется.C++, включая файлы cpp

Однако, когда я компилирую на CMD/терминал (в основном на моем малине pi), если я не включаю файлы cpp, компилятор выдает много ошибок, потому что он не читал файлы cpp.

Почему это так? как идеал знает, что нужно включать в себя файлы cpp currect? и есть ли способ узнать, компилируете ли вы идеал или терминал?

что-то вроде:

#ifdef IDE_KEYWORD 
#endif 
+1

Need WAY дополнительная информация. Как вы компилируете в терминале? Какой компилятор, какие команды вы используете и т. Д. – mascoj

+0

Возможно, вы не добавили исходные файлы 'C++' в ваш проект/Makefile ... – drescherjm

+3

Просто, чтобы было ясно (потому что в существующих ответах это не упоминается): вы ** не должен ** использовать '# include' для компиляции нескольких файлов. IDE тоже этого не делают. Существуют и другие способы управления исходными файлами, '# include' не для этого. – anatolyg

ответ

0

Иды отслеживать, какие файлы находятся в проекте/рабочее пространство, а какие нет. Например, Visual Studio имеет блок в файле vcxproj, который хранит все единицы компиляции, как такой

<ClCompile Include="yourFile.cpp" /> 

имеющий IFDEF, чтобы определить, если вы используете IDE должен быть только вопрос о добавлении IDE_KEYWORD ваших определений препроцессора внутри вашей IDE. то, если вы скомпилируете вне этой среды IDE, IDE_KEYWORD не будет определен.

0

Если вы в Visual Studio вы можете

#ifdef _MSC_VER 
// your code 
#endif 

Если нет, я полагаю, нет никакой возможности.

Ошибка может возникнуть из-за того, что вы не компилируете все файлы .cpp и/или не связываете не все объектные файлы. Если вы используете g ++ g++ -c file.cpp -o file.o для каждого файла для их компиляции. Затем g++ file1.o file2.o fileN.o -o finalExecutable.exe для связи.

Если это кажется сложным взглядом на Makefile. Они замечательные!

2

IDE обычно скомпилирует каждый исходный файл (то, что вы описываете как «файл cpp») отдельно, чтобы создать объектный файл для каждого, а затем связать все объектные файлы (и другие библиотеки). Механически, IDE делает это, вызывая компилятор отдельно для каждого исходного файла, указанного в «файле проекта», а затем связывая его.

При компиляции из командной строки необходимо указать КАЖДЫЙ исходный файл в командной строке - среда IDE не помогает в этом, поэтому вам нужно сделать это вручную.

Один из вариантов заключается в том, чтобы скомпилировать каждый исходный файл отдельно (указать каждый в отдельной командной строке), а затем еще одну команду, чтобы связать все объектные файлы вместе для создания исполняемого файла. По сути, это (более или менее) имитирует то, что делает IDE.

Второй вариант состоит в том, чтобы перечислить КАЖДЫЙ исходный файл в одной командной строке, что заставит компилятор скомпилировать каждый из них последовательно, а затем (в зависимости от того, какие параметры командной строки вы укажете) связывает объектные файлы.

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