Ubuntu和OS-X之间的头文件兼容性

Header file compatibility between Ubuntu and OS-X

本文关键字:文件 兼容性 之间 OS-X Ubuntu      更新时间:2023-10-16

我刚刚在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;
}

问题似乎是某种类型的名称混淆,但我真的不知道发生了什么。什么好主意吗?我错过了什么非常明显的东西?

您需要分两个阶段编译或一次编译所有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函数

链接错误。当你编译和链接main.cpp时,链接器抱怨它找不到你的double 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)