Ошибка связывания из-за символов, не найденных в Бьярне Страуструпе «Программирование и практика с использованием c ++» - PullRequest
4 голосов
/ 01 апреля 2020

Я новичок в c ++ (и скомпилированных языках в целом) и выполняю упражнение в конце 8-й главы Bjarne Stroustrup "Программирование и практика с использованием c ++", но при попытке компиляции я получаю следующую ошибку код

➜  Desktop g++ -std=c++11 *.cpp -o use
Undefined symbols for architecture x86_64:
  "_foo", referenced from:
      print_foo() in my-4f7853.o
      _main in use-46cb26.o
     (maybe you meant: __Z9print_foov)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я также пытался использовать g++ -c my.cpp use.cpp с последующим g++ -o use.exe my.o use.o, но это дало ту же ошибку. Другой подход, который я попробовал, был g++ -c use.cpp -o use.exe, однако use.exe не выдавал выходных данных при запуске. Файлы исходного кода

my.h

extern int foo;
void print_foo();
void print_int(int);

my. cpp

#include "my.h"
#include <iostream>

void print_foo() {
  std::cout << foo << '\n';
}

void print_int(int num) {
  std::cout << num << '\n';
}

use. cpp

#include "my.h"
#include <iostream>

int main() {

  std::cout<<"DSGFSGFSG"<< '\n';
  foo = 7;
  print_foo();

  int i = 99;
  print_int(i);

}

Я смотрел на другие вопросы, которые похожи (если не похоже, что то же самое есть в Ошибки времени соединения в VS 2013 при компиляции программы C ++ - PPP Б. Страуструпа с использованием C ++: гл. 8 - Drill Q1? ) но решения не сработали для меня. Проблема связана с моей компиляцией с использованием g ++ или я сделал более фундаментальную ошибку?

1 Ответ

7 голосов
/ 01 апреля 2020

Глобальная переменная foo только объявлена ​​ в вашем заголовочном файле.
extern int foo;

Вам также необходимо определить в my.cpp
int foo;

Объявление является обещанием: «оно где-то существует».
Определение фактически резервирует некоторое место для этой переменной.

Так что ваш компоновщик жалуется, потому что некоторые код, основанный на этом обещании, должен получить доступ к этому отсутствующему хранилищу.

...