我在C ++ .h类文件中有一个ABC类。
.h文件
#ifndef ABC_H_
#define ABC_H_
class ABC
{
public:
int x;
int y;
};
#endif
.cpp文件
//----- Empty -----------
主程序.cpp
#include <iostream>
#include "ABC.h"
using namespace std;
int main() {
ABC a1;
a1.x=5; a1.y=2;
cout<<a1.x;
// ...
}
在Eclipse中编译时出错:
symbols not found for architecture x86_64
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [CPPProgram] Error 1
所有其他hello world程序等编译运行正常。我记得在使用模板时在单独的文件中进行定义和实现时遇到了这个错误(当我在同一个文件中实现定义和实现时它就消失了)
我不确定这里有什么问题。有什么建议吗?
答案 0 :(得分:4)
在您发布的代码中,您缺少一个分号:
class ABC
{
public:
int x;
int y;
};
^
答案 1 :(得分:0)
您应该确保将正确的头文件包含在.cpp
文件中。您的包含路径中可能还有另一个ABC.h
文件。您可能还会看到文件是否在文件系统上正确命名(例如abc.h
与ABC.H
)。您可以测试是否包含头文件,将类型名称修改为唯一的名称,并查看编译行为是否发生更改。
有人向我指出,编译器应该在其头文件包含保护中使用约定,这些约束不会与普通源文件冲突。确保没有任何头文件定义使用双下划线(__
)的名称,或者以下划线开头,后面跟一个大写字母。
在您的注释中,您列出了有关在一行代码上停止编译的更多信息(您没有为编译停止的原因提供编译错误),并且您添加了有关链接失败的信息。编译器不应该留下部分创建的目标文件,这会导致链接器失败。也许链接器正在寻找某种较旧的目标文件或某种源文件名冲突(例如,test.c
和test.cc
都希望通常留下名为test.o
的目标文件。指示您的编译系统删除所有目标文件(无论等同于make clean
),并查看问题是否仍然存在。如果是,请检查文件名冲突。