- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习如何在 Raspberry PI 上编码。我来自使用 Windows 和 VS Code 进行编码。现在我使用 Linux Mint 19.1 和 ssh 访问 Raspbian 4.14。
问题是,经过长时间的下载我尝试使用的库后,安装编译器、创建文件并找到正确的命令来运行并包含路径后,我得到了 undefined 引用
错误。
我正在尝试编译 https://github.com/hzeller/rpi-rgb-led-matrix 中最简单的示例代码因为我是从这个项目开始的。我没有任何其他代码或示例。
以下是我在命令行中编写的命令:
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
以下命令应该是:
sudo chmod +x main
./main
main.cpp 包含与 https://github.com/hzeller/rpi-rgb-led-matrix/blob/master/examples-api-use/minimal-example.cc 相同的代码
#include "led-matrix.h"
#include <unistd.h>
#include <math.h>
#include <stdio.h>
#include <signal.h>
using rgb_matrix::GPIO;
using rgb_matrix::RGBMatrix;
using rgb_matrix::Canvas;
volatile bool interrupt_received = false;
static void InterruptHandler(int signo) {
interrupt_received = true;
}
static void DrawOnCanvas(Canvas *canvas) {
/*
* Let's create a simple animation. We use the canvas to draw
* pixels. We wait between each step to have a slower animation.
*/
canvas->Fill(0, 0, 255);
int center_x = canvas->width() / 2;
int center_y = canvas->height() / 2;
float radius_max = canvas->width() / 2;
float angle_step = 1.0 / 360;
for (float a = 0, r = 0; r < radius_max; a += angle_step, r += angle_step) {
if (interrupt_received)
return;
float dot_x = cos(a * 2 * M_PI) * r;
float dot_y = sin(a * 2 * M_PI) * r;
canvas->SetPixel(center_x + dot_x, center_y + dot_y,
255, 0, 0);
usleep(1 * 1000); // wait a little to slow down things.
}
}
int main(int argc, char *argv[]) {
RGBMatrix::Options defaults;
defaults.hardware_mapping = "regular"; // or e.g. "adafruit-hat"
defaults.rows = 32;
defaults.chain_length = 1;
defaults.parallel = 1;
defaults.show_refresh_rate = true;
Canvas *canvas = rgb_matrix::CreateMatrixFromFlags(&argc, &argv, &defaults);
if (canvas == NULL)
return 1;
// It is always good to set up a signal handler to cleanly exit when we
// receive a CTRL-C for instance. The DrawOnCanvas() routine is looking
// for that.
signal(SIGTERM, InterruptHandler);
signal(SIGINT, InterruptHandler);
DrawOnCanvas(canvas); // Using the canvas.
// Animation finished. Shut down the RGB matrix.
canvas->Clear();
delete canvas;
return 0;
}
错误:
/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 g++ main1.cpp main2.cpp
makefile
在寻找类似的问题并希望找到一些神奇的解决方案时,我最终比以前更加困惑。我不知道我所做的是否是我应该做的。
makefile
或者它为何存在。我的问题可能针对我的具体情况,但我相信答案将对我 future 的项目有所帮助。
您可以自由地回答我的所有问题和误解,并帮助我了解正在发生的事情,或者只回答与标题相关的问题:为什么 makefile
?
最佳答案
The problem is that, after a long battle with downloading the library that I am trying to use, after installing a compiler, creating a file, and finding the right command to run and include paths I get undefined reference to errors.
已经有很多与此类问题相关的问题和答案,特别是 What is an undefined reference/unresolved external symbol error and how do I fix it?
Possible fixes that I found:
- Link .cpp files in a strict order when compiling:
sudo g++ main1.cpp main2.cpp
- [SO question with answers saying roughly the same as the previous]
通常不相关。尽管不同对象/库的链接顺序很重要,但这很少影响在同一编译命令中指定所有所需的 C 和/或 C++源文件的情况。
- The need of a makefile
使用make
本质上并不能解决问题,而且它当然不是解决问题的必要。编写一个提供成功构建的 makefile,无论是直接还是通过 CMake 或 Autotools 等构建工具,都需要您至少在较高层次上了解编译器和链接器的工作原理、它们的输入和输出是什么以及它们的作用是什么。参数和选项的含义。
- What cpp files to link if I have just one ?
您根本不链接.cpp
(直接)。您编译它并将结果链接到任何需要的库和任何其他对象。默认情况下,g++
将尝试一步完成所有操作,在这种情况下,该过程通常称为“编译”,而不是“链接”,即使这两个函数都已执行。通过指定 -c
选项(事实证明,这在 makefile 中很常见),可以使 g++
仅进行编译,而不进行链接,并且它会很高兴如果您没有为其命名任何源文件,则链接对象和库而不编译任何内容。
无论如何,您的情况根本不仅仅是一个 .cpp
文件。这是您的一个.cpp
文件加上您尝试使用的库的所有文件。
- Do I need to link all the .cpp and .h files that the library has ?
您不需要编译(直接)或链接任何.h 文件。但是,如果您想使用下载了源代码的库,您确实需要编译所有源代码,并且您可能应该将它们链接到实际的库中。此外,除非您生成并使用静态库,否则您还应该安装您构建的库。看起来库源代码包含一个 makefile,因此强烈建议您使用 make
来执行这些步骤。
- I don't understand a thing about makefile or why it even exists.
makefile 是 make
的输入。一份写得好的定义了如何构建一个或多个“目标”的规则,并表达了这样做的先决条件(通常是原始来源或其他目标)。 make
使用这些以及一组内置规则来确定需要采取哪些步骤来构建您要求其构建的目标,以及它可以跳过哪些步骤。例如,通常会编写 makefile,以便在构建多源项目时仅修改一个源文件,然后再次构建,则仅重新编译修改后的源文件。
当您习惯于只有少数来源的项目时,这可能看起来微不足道,但在较大的项目中,它变得很重要,因为在这些项目中,完全重建的成本很高——在某些情况下需要花费很多时间。但即使完整的构建只需要几分钟,如果您真的只需要花费几秒钟,那么一整天的工作都会浪费大量时间。
总的来说,那么:
When do I need to use/have a makefile?
从来没有。但提供一个好的 make 并使用 make
来构建您的项目具有以下优点:
这些也可以通过简单的构建脚本来实现,但是make
也可以给你
关于c++ - 我什么时候需要使用/拥有 makefile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56344144/
拥有/想要列表匹配算法 我正在一个高流量网站上实现一个元素交易系统。我有大量用户,每个用户都为许多特定项目维护一个 HAVE 列表和一个 WANT 列表。我正在寻找一种算法,使我能够根据您的 HAVE
我可以知道拥有 .hgtags 的目的是什么吗?我可以删除它吗?因为它不在 .hg文件夹,似乎“污染”了我的实际源代码目录。 https://bz.mercurial-scm.org/show_bug
在哪些用例中使用 [[nodiscard]] 有益类型? 关于类型,[[nodiscard]]如果任何返回该类型实例的函数的返回值被省略,则发出警告; (引自 p0068r0): If [[nodis
我知道当一个对象只有一个所有者时使用std::unique_ptr,当一个对象有多个所有者时使用std::shared_ptr。成为对象的唯一所有者意味着什么? 成为唯一所有者是否意味着其他人都无法看
我无法真正理解拥有 vendor 文件夹的目的。根据我了解到的情况, vendor 文件夹似乎只有在您尝试使您的存储库与早于 1.11 的 golang 版本兼容时才有用。 .我们正在运行 golan
我正在尝试学习如何在 Raspberry PI 上编码。我来自使用 Windows 和 VS Code 进行编码。现在我使用 Linux Mint 19.1 和 ssh 访问 Raspbian 4.1
我有一个带有“BlockType”枚举的图形程序。根据州的不同,这可能是以下几种情况之一:木头、石头、草地等。 最初,必须针对每种可能性执行各种纹理操作,但由于进行了一些重构,枚举仅用作整数,swit
我正在创建一个网络应用程序,让用户可以搜索餐馆和咖啡馆。由于我目前除了类型之外没有其他数据来区分这两者,所以我有两种存储餐馆列表的选择。 对餐厅和咖啡馆使用同一张表,并使用枚举(文本)列说明条目是餐厅
我有一个 5 人的小团队,我需要帮助寻找有关如何拥有一个集中式 MySQL 数据库的资源或建议。我们都以虚拟方式工作,并将所有文件托管在一个 github 上以集中所有内容。因此,在不同的计算机上拥有
SELECT dnum , SUM(IF(salary>20000, 1, 0)) AS Employee FROM project INNER JOIN works_on ON pno=pnumbe
我想在 javascript 中有一个数组,其中每个项目包含 2 个属性而不是 1 个,这怎么可能? 默认情况下,以下内容仅向项目添加一个属性: var headerCellWidths = new
我确定我对这个问题的措辞很糟糕,但这是我的问题: 我正在创建一长串地毯,每 block 地毯都有图片、标题、尺寸、原价和清仓价。我将每 block 地毯都放在自己的类别中,并对其余的地毯重复这样的操作
我正在编写一个延迟渲染器,并试图打包我的 gbuffer。 将漫反射和高光存储在一起会更好吗: vec4 difSpec = (diffuse.xyz, specular) // FORMAT_RGB
下面的程序给我一个链接时错误: #include struct Test { static constexpr char text[] = "Text"; }; int main() { s
想知道 - 如果了解Linux 的生活方式或 Linux 架构,是否会为在嵌入式设备上编程提供更好的思路,尤其是当它们具有某种操作系统时。 只是想确定我没有错过任何重要的事情:) 注意: 我来自 wi
如果要测试 iPhone 应用程序,拥有一个开发代码签名条款来运行任何带有 com.mydomain.* 的应用程序是不是一个坏主意? 为什么? 编辑: 请参阅上面的斜体编辑。 最佳答案 我对此表示怀
我正在开发我自己的 Swift 框架,以便在我的两个应用程序之间私下使用。我正在使用 Carthage 来管理该依赖项和其他依赖项。 我终于完成了框架的开发并将其连接到我的一个应用程序,毫不奇怪,该应
如果我有一个 C 类型的原始指针,是否可以从拥有指针数据的相同类型创建一个 std::vector 而无需任何数据复制(仅 move )?促使我问这个问题的是 std::vector 的 data()
有 2 个部分的好处是什么 - .data 和 .bss 用于流程范围变量。为什么不只拥有一个呢?我知道每个部分的用途。我正在使用 gcc。 最佳答案 .bss 消耗“内存”但不消耗可执行文件中的空间
我注意到,我们可以使用 StatefulWidget 构建 UI 的任何部分,而无需担心状态。 我想问的很简单,当我们可以将任何 UI 类构建为 StatefulWidget 时,首先拥有 State
我是一名优秀的程序员,十分优秀!