编程原理和实践第二版第8章钻探1
Programming Principles and Practice 2nd ed chapter 8 drill 1
问题:
我无法获得作者提供的代码以通过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项目之类的构建工具,该工具会自动为您管理这些步骤。
- 将二维矢量传递给类
- 二叉排序树无法编译
- 在计算中使用二的幂有多有利可图
- 将值从二维数组输出到文本文件
- 从父数组测试用例构造二叉树失败
- 我在二维向量中是否正确分配了内存
- 带结构的二维矢量:如何存储元素
- C++初级读本5版1.23从文件流中读取
- 旧版c++中结构和类之间的差异
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 使用C++创建特殊的二叉搜索树
- 如何正确填充在堆上分配的二维数组?
- 输出 0 和 -0 的二次公式,与给定的项无关
- C++入门 5 版:类消息和文件夹
- 传递二维数组时出现问题
- C++ 入门第 5 版第 17.5.3 章 fstream 没有添加新行
- 编程原理和实践第二版第8章钻探1
- 'Programming: Principles and Practice Using C++'(第2版),作者:Bjarne stroustrup,第3.3章:代码不起作用