编程原理和实践第二版第8章钻探1

Programming Principles and Practice 2nd ed chapter 8 drill 1

本文关键字:二版 8章 编程      更新时间:2023-10-16

问题:

我无法获得作者提供的代码以通过Bjarne Stroustrup的编程原理和实践的第8章中的Clang 链接。

代码:

 ~/scratch/cpp/chp8 (09/10/2017-13:51:43[EDT]) cat my.cpp
#include <iostream>
#include "my.h"
void print_foo() { std::cout << foo << std::endl; }
void print(int i) { std::cout << i << std::endl; }
 ~/scratch/cpp/chp8 (09/10/2017-13:52:29[EDT]) cat my.h
#ifndef MY_H
#define MY_H
extern int foo;
void print_foo();
void print(int);
#endif
 ~/scratch/cpp/chp8 (09/10/2017-13:52:33[EDT]) cat use.cpp
#include "my.h"
int main() {
  foo = 7;
  print_foo();
  print(99);
  return 0;
}

尝试:

我尝试了一些不同的方法来编译以下方式:

一个 - 编译包含主函数的驱动程序应用程序。

 ~/scratch/cpp/chp8 (09/10/2017-13:52:39[EDT]) clang++ -std=c++14 -stdlib=libc++  use.cpp -o use.cpp.o
Undefined symbols for architecture x86_64:
  "print(int)", referenced from:
      _main in use-2864c4.o
  "print_foo()", referenced from:
      _main in use-2864c4.o
  "_foo", referenced from:
      _main in use-2864c4.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

两个 - 特别是编译my.cpp文件而不是链接。尽管我成功地编译了我不确定如何链接使用。CPP现在与此对象文件链接。

 ~/scratch/cpp/chp8 (09/10/2017-14:09:40[EDT]) clang++ -std=c++14 -stdlib=libc++ -c my.cpp -o my.cpp.o

三个 - 使用所有.cpp文件。

 ~/scratch/cpp/chp8 (09/10/2017-14:15:32[EDT]) clang++ -std=c++14 -stdlib=libc++ my.cpp use.cpp
Undefined symbols for architecture x86_64:
  "_foo", referenced from:
      print_foo() in my-2243d1.o
      _main in use-796f91.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)

问题:

除了我在做什么错的明显问题之外,我对我想念或错过的理解更感兴趣?

注意:

我不是在寻找我应该做什么或不应该做的意见或偏好。这是我对这本书进行的纯粹教育冒险,我想保留它。

MISC:

 ~/scratch/cpp/chp8 (09/10/2017-14:15:25[EDT]) uname -a
Darwin abes-MacBook-Pro.local 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64
 ~/scratch/cpp/chp8 (09/10/2017-14:15:28[EDT]) clang++ -v
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

您获得的错误与编译和链接之间的区别无关。而是您的代码中存在错误。发生错误的原因是因为您是声明全局变量foo,但您从来没有> define it。您需要添加行

int foo = 0;

到您的.cpp文件之一。这可能是my.cpp中最有意义的。

请注意,使用这样的全局变量被认为是一种编码恐怖。您不应该在实际代码中执行此操作。

关于编译和链接:

从您的C 创建可执行文件需要几个步骤。在这里,我们将谈论编译与链接以及如何手动执行这些步骤。还有其他步骤,但我不会在这里进入。

首先,您可以一次编译和链接所有源文件:

$ clang++ -std=c++14 -stdlib=libc++ my.cpp use.cpp

我很困惑为什么这在您的"尝试三"中不起作用。我会很快研究一下。

要手动编译和链接源代码,您可以执行以下操作:

$ clang++ -std=c++14 -stdlib=libc++ -c my.cpp -o my.o
$ clang++ -std=c++14 -stdlib=libc++ -c use.cpp -o use.o
$ clang++ -std=c++14 -stdlib=libc++ my.o use.o -o use

请注意,我将my.cpp编译到my.o而不是my.cpp.o。这是对此的共同约定。

另外,一旦您对这些概念感到满意,我强烈建议您使用诸如make或Xcode项目之类的构建工具,该工具会自动为您管理这些步骤。