Xcode 不会检测包含文件中的主文件中包含的文件

Xcode won't detect files included from main in included file

本文关键字:文件 包含 主文件 检测 Xcode      更新时间:2023-10-16

这是我的程序结构:

// File: main.cpp
#include <iostream>
#include <math.h>
using namespace std;
#include "do.cpp"
int main()
{
   doit();
}
// File: do.cpp
void doit()
{
   cout<<sqrt(2)<<endl;
}

当我这样做时 G++ 主.cpp

一切都很顺利。现在,如果我将其作为Xcode项目打开(我选择了"命令行实用程序"作为项目类型)并尝试仅构建和运行,它一直说: 使用未声明的标识符 sqrt 未知类型名称"ostream"

我应该怎么做?我做错了什么吗?

谢谢!

马迪奥

不要这样做:

#include "do.cpp"

而是将" do.cpp"文件放在同一个 Xcode 项目中,与您的 main.m 或 main.cpp 文件放在一起。

当您想从命令行构建时,您可以执行以下操作:

g++ main.cpp do.cpp -o mytesttool

这将创建名为"mytesttool"的命令行工具。

解释其实很简单。您可能将这两个文件都添加到了项目中。Xcode 尝试将每个文件编译成一个目标文件,然后将它们链接在一起。

当它尝试编译do时.cpp它找不到cout的定义,因为不包括iostream,也没有包含sqrt的math.h,作为do.cpp的一部分。

该文件在作为 main.cpp 的一部分编译时编译得很好,因为它包含在文件中,它找到 iostream 和 math.h 以及 using 声明。

无论如何,如果您从项目中删除 do.cpp(只是引用),则所有内容都应按预期编译。

没有头文件的正确方法

// File: main.cpp
void doit();  // declare the function
int main()
{
   doit();
}
// File: do.cpp
#include <iostream>
#include <math.h>
using namespace std;
void doit()
{
   cout<<sqrt(2)<<endl;
}

使用头文件的正确方式

// File do.h
#ifndef __DO_H_
#define __DO_H_
void doit();
#endif  // __DO_H_
// File: main.cpp
#include "do.h"
int main()
{
   doit();
}
// File: do.cpp
#include <iostream>
#include <math.h>
#include "do.h"
using namespace std;
void doit()
{
   cout<<sqrt(2)<<endl;
}

制作新文件时,我忘了取消选中"目标"选择,因此当它尝试构建项目时,它会尝试构建所有单个文件,然后将它们链接在一起。通过禁用"目标",我让它工作。