Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我什么时候需要使用/拥有makefile?_C++_C_Linux_Makefile_Raspberry Pi - Fatal编程技术网

C++ 我什么时候需要使用/拥有makefile?

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

我正在努力学习如何在树莓圆周率上编码。 我来自使用Windows和VS代码进行编码。 现在我使用Linux Mint 19.1和ssh访问Raspbian 4.14

问题是,在与下载我尝试使用的库进行了长期斗争之后,在安装编译器、创建文件、找到正确的命令运行并包含路径之后,我得到了对错误的
未定义引用

我正试图从中编译最简单的示例代码 因为我是从这个项目开始的。我没有任何其他代码或示例

以下是我在命令行中编写的命令:

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文件吗
您不需要编译(直接)或链接任何.h文件。但是,如果您想使用您下载的源代码所在的库,您确实需要编译所有源代码,并且您可能应该将它们链接到实际的库中。此外,除非生成并使用静态库,否则还应安装生成的库。库源代码似乎包含一个makefile,因此建议您使用
make
执行这些步骤

  • 我对makefile一点也不了解,也不明白它为什么会存在
makefile是
make
的输入。写得好的定义了如何构建一个或多个“目标”的规则,并表达了这样做的先决条件(通常是原始源或其他目标)
make
使用这些规则以及一组内置规则,来确定要构建目标需要采取哪些步骤,以及可以跳过哪些步骤。例如,编写makefiles是很典型的,这样,如果您构建一个多源项目,只修改一个源文件,然后再次构建,则只重新编译修改过的源文件

当您习惯于只有少量资源的项目时,这可能显得微不足道,但在大型项目中,这一点变得非常重要,因为在大型项目中,完整的重建非常昂贵——在某些情况下,需要花费很多时间。但是,即使一个完整的构建只需要几分钟,如果你真的只需要花费几秒钟,那么这将在一整天的工作中浪费大量的时间

总的来说,那么:

我什么时候需要使用/拥有makefile

从来没有。但是,提供一个好的项目并使用
make
构建您的项目有以下优点:

  • 以持久、可操作的形式存储所有需要的构建命令,包括选项和参数,因此
  • 提供f