C++ 我什么时候需要使用/拥有makefile?
我正在努力学习如何在树莓圆周率上编码。 我来自使用Windows和VS代码进行编码。 现在我使用Linux Mint 19.1和ssh访问Raspbian 4.14 问题是,在与下载我尝试使用的库进行了长期斗争之后,在安装编译器、创建文件、找到正确的命令运行并包含路径之后,我得到了对错误的C++ 我什么时候需要使用/拥有makefile?,c++,c,linux,makefile,raspberry-pi,C++,C,Linux,Makefile,Raspberry Pi,我正在努力学习如何在树莓圆周率上编码。 我来自使用Windows和VS代码进行编码。 现在我使用Linux Mint 19.1和ssh访问Raspbian 4.14 问题是,在与下载我尝试使用的库进行了长期斗争之后,在安装编译器、创建文件、找到正确的命令运行并包含路径之后,我得到了对错误的未定义引用 我正试图从中编译最简单的示例代码 因为我是从这个项目开始的。我没有任何其他代码或示例 以下是我在命令行中编写的命令: sudo apt-get install g++ mkdir 4panel cd
未定义引用
我正试图从中编译最简单的示例代码
因为我是从这个项目开始的。我没有任何其他代码或示例
以下是我在命令行中编写的命令:
sudo apt-get install g++
mkdir 4panel
cd 4panel
sudo nano main.cpp
git clone https://github.com/hzeller/rpi-rgb-led-matrix.git
sudo g++ -Wall -Irpi-rgb-led-matrix/include main.cpp -o main
/tmp/cci8MGL5.o: In function `main':
main.cpp:(.text+0x264): undefined reference to `rgb_matrix::RGBMatrix::Options::Options()'
main.cpp:(.text+0x2a8): undefined reference to `rgb_matrix::CreateMatrixFromFlags(int*, char***, rgb_matrix::RGBMatrix::Options*, rgb_matrix::RuntimeOptions*, bool)'
collect2: error: ld returned 1 exit status
应使用以下命令:
sudo chmod +x main
./main
main.cpp包含与
我发现的可能修复方法:
sudo apt-get install g++
mkdir 4panel
cd 4panel
sudo nano main.cpp
git clone https://github.com/hzeller/rpi-rgb-led-matrix.git
sudo g++ -Wall -Irpi-rgb-led-matrix/include main.cpp -o main
/tmp/cci8MGL5.o: In function `main':
main.cpp:(.text+0x264): undefined reference to `rgb_matrix::RGBMatrix::Options::Options()'
main.cpp:(.text+0x2a8): undefined reference to `rgb_matrix::CreateMatrixFromFlags(int*, char***, rgb_matrix::RGBMatrix::Options*, rgb_matrix::RuntimeOptions*, bool)'
collect2: error: ld returned 1 exit status
-
- 编译时严格按顺序链接.cpp文件:
sudo g++main1.cpp main2.cpp
-
-
- 需要一个
makefile
在寻找类似问题并希望找到一些神奇的解决方法时,我比以前更加困惑。我不知道我所做的是否是我应该做的
-
- 如果我只有一个cpp文件,要链接哪些cpp文件
-
- 我需要链接库中所有的.cpp和.h文件吗
-
- 我对
makefile
一点也不了解,也不明白它为什么会存在
我的问题可能与我的情况有关,但我相信这些答案将有助于我今后的项目
您可以自由回答我的所有问题和误解,并帮助我了解正在发生的事情,或者只回答与标题相关的问题:为什么makefile
?
问题是,在下载图书馆的长期斗争之后
在安装编译器后,创建一个文件,
并找到正确的命令来运行,并包含未定义的路径
参考错误
关于这些问题,已经有很多问题和答案,特别是
我发现的可能修复方法:
sudo apt-get install g++
mkdir 4panel
cd 4panel
sudo nano main.cpp
git clone https://github.com/hzeller/rpi-rgb-led-matrix.git
sudo g++ -Wall -Irpi-rgb-led-matrix/include main.cpp -o main
/tmp/cci8MGL5.o: In function `main':
main.cpp:(.text+0x264): undefined reference to `rgb_matrix::RGBMatrix::Options::Options()'
main.cpp:(.text+0x2a8): undefined reference to `rgb_matrix::CreateMatrixFromFlags(int*, char***, rgb_matrix::RGBMatrix::Options*, rgb_matrix::RuntimeOptions*, bool)'
collect2: error: ld returned 1 exit status
-
- 编译时严格按顺序链接.cpp文件:
sudo g++main1.cpp main2.cpp
-
- [因此,问题的答案与前面的答案大致相同]
通常不相关。虽然不同对象/库的链接顺序是很重要的,但当所有需要的C和/或C++源文件在同一编译命令中指定时,很少会影响到该情况。
-
- 需要一个makefile
使用make
不能从本质上解决问题,当然也没有必要解决问题。无论是直接还是通过构建工具(如CMake或Autotools),编写一个为成功构建提供支持的makefile需要您至少从较高的层次了解编译器和链接器的工作方式、它们的输入和输出以及它们的参数和选项的含义
-
- 如果我只有一个cpp文件,要链接哪些cpp文件
您根本不(直接)链接.cpp
。您可以编译它并将结果链接到任何需要的库和任何其他对象<默认情况下,code>g++
将尝试在一个步骤中完成这一切,在这种情况下,该过程通常称为“编译”,而不是“链接”,即使两个功能都已执行<通过指定-c
选项(事实证明,这在makefiles中很常见),可以使code>g++只进行编译,而不进行链接,如果您不给它命名任何源文件,它将很乐意链接对象和库,而无需编译任何内容
无论如何,您的案例根本不是一个.cpp
文件。它是您的一个.cpp
文件,加上您试图使用的库的所有文件
- 我需要链接库中所有的.cpp和.h文件吗
make
执行这些步骤
- 我对makefile一点也不了解,也不明白它为什么会存在
make
的输入。写得好的定义了如何构建一个或多个“目标”的规则,并表达了这样做的先决条件(通常是原始源或其他目标)make
使用这些规则以及一组内置规则,来确定要构建目标需要采取哪些步骤,以及可以跳过哪些步骤。例如,编写makefiles是很典型的,这样,如果您构建一个多源项目,只修改一个源文件,然后再次构建,则只重新编译修改过的源文件
当您习惯于只有少量资源的项目时,这可能显得微不足道,但在大型项目中,这一点变得非常重要,因为在大型项目中,完整的重建非常昂贵——在某些情况下,需要花费很多时间。但是,即使一个完整的构建只需要几分钟,如果你真的只需要花费几秒钟,那么这将在一整天的工作中浪费大量的时间
总的来说,那么:
我什么时候需要使用/拥有makefile
从来没有。但是,提供一个好的项目并使用make
构建您的项目有以下优点:
- 以持久、可操作的形式存储所有需要的构建命令,包括选项和参数,因此
- 提供f