由于在 Bjarne Stroustrup“使用 c++ 的编程和实践”中找不到符号而导致的链接错误

Posted

技术标签:

【中文标题】由于在 Bjarne Stroustrup“使用 c++ 的编程和实践”中找不到符号而导致的链接错误【英文标题】:Linking Error due to symbol(s) not found in Bjarne Stroustrup "Programming and Practices using c++" 【发布时间】:2020-04-01 10:32:03 【问题描述】:

我是 C++ 新手(以及一般的编译语言),并且正在 Bjarne Stroustrup “使用 C++ 编程和实践”的第 8 章末尾进行练习,但是当我尝试编译时出现以下错误代码

➜  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 在运行时没有产生任何输出。源代码文件是

我的.h

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

我的.cpp

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

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


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

使用.cpp

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

int main() 

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

  int i = 99;
  print_int(i);


我查看了其他类似的问题(如果在Link-time errors in VS 2013 while compiling the C++ program - B. Stroustrup's PPP using C++: Ch. 8 - Q1 Drill? 中看起来不一样),但解决方案对我不起作用。问题与我使用 g++ 的编译有关还是我犯了更根本的错误?

【问题讨论】:

请不要发布带有行号前缀的代码——它们并没有真正的帮助,而且它们会让其他人更难以复制您的代码并自己运行。 【参考方案1】:

全局变量foo 仅在您的头文件中声明extern int foo;

您还需要在my.cppint foo;

定义

声明是一个承诺:“它存在于某处”。 定义实际上为这个变量保留了一些存储空间。

所以你的链接器抱怨,因为一些代码依赖于此 promise 需要访问这个缺失的存储空间。

【讨论】:

以上是关于由于在 Bjarne Stroustrup“使用 c++ 的编程和实践”中找不到符号而导致的链接错误的主要内容,如果未能解决你的问题,请参考以下文章

Bjarne Stroustrup 语录1

代码在 Visual c++ 中无法按预期工作(来自 bjarne stroustrup 编程和原则书 2n 版的示例)

C++之父Bjarne Stroustrup:程序员在数学上付出的努力,永远也不会白费

C++之父Bjarne Stroustrup:程序员在数学上付出的努力,永远也不会白费

无法编译应该从 Bjarne stroustrup 的编程原理和实践的第 12 章工作的图形代码

模板 :: Stroustrup 的示例未编译