当我在我的IDE(visual studio或xCode)上工作时,我从不包含cpp文件(只有h文件),所有内容都完美编译。
然而,当我在cmd /终端上编译时(主要是在我的覆盆子pi上)如果我不包含cpp文件,编译器会抛出许多错误,因为他没有读取cpp文件。
为什么? ide如何知道包含当前的cpp文件?有没有办法找出你是通过ide还是终端进行编译?
类似的东西:
#ifdef IDE_KEYWORD
#endif
答案 0 :(得分:2)
IDE通常会分别编译每个源文件(您将其描述为" cpp文件"),为每个源文件生成一个目标文件,然后链接所有目标文件(和其他库) 。从机制上讲,IDE通过为"项目文件"中列出的每个源文件单独调用编译器来实现这一点。然后链接。
从命令行编译时,需要在命令行中指定每个源文件 - IDE不帮助这样做,因此您需要手动执行。
一个选项是单独编译每个源文件(在单独的命令行中指定每个源文件),然后使用另一个命令将所有目标文件链接在一起以生成可执行文件。实际上,这(或多或少)模仿IDE的功能。
第二个选项是在单个命令行上列出每个源文件 - 这将导致编译器按顺序编译每个源文件,然后(根据您指定的命令行选项)将目标文件链接在一起。
答案 1 :(得分:0)
IDE跟踪项目/工作区中的文件以及不属于哪些文件。例如,Visual Studio在vcxproj文件中有一个块,它存储所有编译单元
<ClCompile Include="yourFile.cpp" />
使用ifdef来确定您是否使用IDE应该只是将IDE_KEYWORD
添加到IDE中的预处理器定义。然后,如果您在该IDE之外编译,则不会定义IDE_KEYWORD
。
答案 2 :(得分:0)
如果您在Visual Studio中,则可以
([^_]+)
如果不是,我想没有办法。
可能会发生错误,因为您没有编译所有.cpp文件和/或不链接所有目标文件。
如果为每个文件使用g ++ #ifdef _MSC_VER
// your code
#endif
来编译它们。然后g++ -c file.cpp -o file.o
进行链接。
如果看起来很复杂,请查看Makefile。他们太棒了!