Совместимость заголовочных файлов между Ubuntu и OS-X - PullRequest
0 голосов
/ 09 декабря 2011

Я только что закончил класс на C / C ++ в среде Linux, и когда я скопировал и запустил несколько простых кодов на своем 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;

}

Кажется, что проблемы с каким-то типом искажения имени, но я не могу точно сказать, что происходит. Есть идеи? Что-то невероятно очевидное, что мне не хватает?

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

вам нужно скомпилировать в два этапа или скомпилировать все файлы 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

0 голосов
/ 09 декабря 2011

Это ошибка компоновщика. Когда вы компилируете и связываете 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)

...