尽管使用g ++,clang等进行编译,但仍然存在C ++链接器错误

时间:2017-04-27 23:11:06

标签: c++

我首先向您展示我遇到的错误:

Henrys-MacBook-Pro-2:assignment1 HenryDashwood$  clang++ main.cpp
Undefined symbols for architecture x86_64:
  "clear()", referenced from:
      _main in main-a61991.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我一直试图将一些函数移动到一个source.cpp文件中,并在header.h文件中包含原型。当我在main.cpp文件中拥有它时,代码工作正常。当我将函数原型移动到头文件时,它也有效。但是,当我然后将函数移动到源文件时,它会让我错误!以下是我的代码的相关部分:

的main.cpp

#include <string>
#include <iostream>
using namespace std;
#include "header.h"


int main()
{
  char quit, choice;
  int term, day, hour;
  string termName, dayName;

  clear();

  return 0;
}

header.h

#define TERMS 4
#define DAYS 7
#define HOURS 8

struct TTcell
{
    string subject;
    string lecturer;
    string roomName;
};

struct TTcell timetables[8][7][4];

void clear();

source.cpp

#include <string>
#include <iostream>
using namespace std;
#include "header.h"

void clear()
{
  for (size_t i = 0; i < TERMS; i++) {
    for (size_t j = 1; j <= DAYS; j++) {
      for (size_t k = 1; k <= HOURS; k++) {
        timetables[k][j][i].subject = "";
        timetables[k][j][i].lecturer = "";
        timetables[k][j][i].roomName = "";
      }
    }
  }
}

这是一个使用一个函数来保持问题可读的示例。他们似乎都有同样的痛苦。我在其他帖子上看到,由于他们使用的编译器,人们有类似的错误。我尝试过c ++,g ++和clang ++,但都无济于事。

提前感谢您提出的任何想法!

2 个答案:

答案 0 :(得分:2)

您可以通过两种方式进行此编译。

在一行上编译所有cpp文件

g++ main.cpp source.cpp -o main

单独编译并链接

g++ -c main.cpp
g++ -c source.cpp
g++ -o main main.o source.o

答案 1 :(得分:1)

这是引入源文件的标准失败,与编译器无关。

Henrys-MacBook-Pro-2:assignment1 HenryDashwood$  clang++ main.cpp

你没有建立&amp;链接source.cpp

因此,就Clang所知,clear()的定义确实不存在。

Henrys-MacBook-Pro-2:assignment1 HenryDashwood$  clang++ main.cpp source.cpp