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

Posted

技术标签:

【中文标题】Ubuntu和OS-X之间的头文件兼容性【英文标题】:Header file compatibility between Ubuntu and OS-X 【发布时间】:2011-12-09 09:52:00 【问题描述】:

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


似乎问题出在某种类型的名称修改上,但我真的不知道发生了什么。有任何想法吗?我遗漏了一些非常明显的东西?

【问题讨论】:

您需要将 mysin.cpp 包含在编译中,以便链接器可以看到您的函数 mysin 的定义。试试g++ -o main mysin.cpp main.cpp -lm 旁注(不能解决问题):不要复制原型;使用头文件。 【参考方案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 函数

【讨论】:

...当然。新的错误信息让我失望了。非常感谢。【参考方案2】:

这是一个链接器错误。当你编译和链接 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)

【讨论】:

以上是关于Ubuntu和OS-X之间的头文件兼容性的主要内容,如果未能解决你的问题,请参考以下文章

找不到QT的头文件怎么办?

C++中的cmath头文件

在哪里告诉 Qt Creator 搜索用于自动完成的头文件

我include自己的头文件,编译器却提示找不到,大家帮忙看看怎么回事好么?

linux下编写c++,include的那些头文件在啥地方

Eclipse C++:如何在头文件和实现文件之间快速切换?