我刚刚在Linux环境下用C / C ++完成了一个类,当我复制并在我的Mac上运行一些简单的代码(OS-X 10.7 Lion)时,我遇到了一些错误。我在两个平台上都使用gcc / g ++。似乎原型设计没有正确传输:当我对mysin.cpp文件进行原型化时,它会吐出下面的错误,但是当我将函数定义复制到它的位置时(即将所有代码放在一个文件中),它工作正常。
输出:
J-MacBook-Pro jh$ g++ -o main main.cpp -lm
Undefined symbols for architecture x86_64:
"mysin(double, double)", referenced from:
_main in cc67Vpm6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
mysin.cpp
#include <math.h>
double mysin(double x, double tol) {
int N;
int ii = 1;
double q;
double sN = x;
double cont = x;
double term = x;
while (fabs(term) > tol) {
term = term * (-x * x) / ((2 * ii + 1) * (2 * ii));
sN = sN + term;
ii = ii + 1;
}
return sN;
}
的main.cpp
#include <iostream>
#include <math.h>
double mysin(double x, double tol);
using namespace std;
int main(){
cout << "sin(1) = " << mysin(1, 1e-6) << endl;
}
似乎问题是某些类型的名称损坏,但我无法确切地说明发生了什么。有任何想法吗?我错过了一些非常明显的东西?
答案 0 :(得分:1)
您需要分两个阶段进行编译,或者像
一样编译所有c文件g++ -o main.o -c main.cpp
g++ -o mysin.o -c mysin.cpp
g++ -o main main.o mysin.o -lm
或
g++ -o main mysin.cpp main.cpp -lm
否则g ++只会查看main.cpp而无法找到你的mysin函数
答案 1 :(得分:0)
这是一个链接器错误。当你编译并链接main.cpp时,链接器抱怨它找不到你的双mysin的定义(编译代码)(double x,double tol),因为你没有告诉编译器它在哪里。
因此,编译两个源文件,然后将它们链接在一起:
g++ -c -Wall mysin.cpp -o mysin.o
g++ -c -Wall main.cpp -o main.o
g++ -o main main.o mysin.o -lm
(你也许也可以做g ++ -Wall -o main main.cpp mysin.cpp -lm)