Esper 发布的文章

几年前看杂志的时候,看到了SBC(Single Board Computer)专区。当时一眼见到只需要两位数RMB价格的【电脑】,现在还记忆犹新。然后,就有了我现在面前的这块Pine64开发板。它一直在我柜子里吃灰,直到最近我在linux方面有了一定的了解后,它才得以重见天日。(Pine64: QAQ)

之前我的想法是装Android来看看电视,打打游戏什么的,之后由于硬件匮乏,不了了之。

现在打算了解一下linux的结构和功能,然后到wiki上找了个ubuntu装上,结果。。编译无线网卡驱动的时候傻眼了,没有内核头文件。到apt上去下,又只有4.x的包,望着这个3.10.104的kernel,我傻眼了。仔细想想,kernel headers说不定就是kernel编译时用到的文件。然后就到longsleep大牛的github里翻到了对应的内核源码。然后对照一台正常amd64架构kernel headers的文件结构看了一下,发现两者区别不大,就依葫芦画瓢,放到/usr/src/下,再跟/lib/modules/<kernel-name>/build一类的相关文件(夹)做好软链接。

然后就遇到了arm64aarch64的问题。按照网络上的说法,两者虽然相似,但还是有区别的。但是看到内核的build脚本里用的也是arm64就直接把arm64软链接到了aarch64,然后居然还没出什么问题。

之后根据make的提示,对内核包做了一下预编译以使它可以参与编译驱动(预警:预编译配置将会面临巨大数量的选项,基本看不懂,看得我一脸懵逼)。然后就又出错了。这回的错误好像与内核的版本有关。在网络上查到这么一条解决方案,但是并没有看懂:https://blog.csdn.net/playboysssss/article/details/52493751

至于标题中的这个“伪”字,用意为提示,因为我也不知道这样到底是不是正确方法。如果我的猜测没有问题的话,kernel headers应该算是配好了。至于编译网卡驱动还有没有后续,就要看缘分了……

==========================================================

啊哈!然而当你看到这里的时候,会得到这样一个消息:实际上,这篇教程是不完整而错误的(逃

由于这也算是前期学习的过程记录,我也不打算删除,不过贴一个跳转:Pine A64 Xenial Mate [20161215] 安装 kernel_headers + USB网卡驱动

上面这个是完整版的哟

惊了,才发现把故事讲了两遍 但是显然第二遍讲的更好啊

在计组的课程学习中,打算动手实现一下IEEE 754的浮点数计算。首先要做的就是从机器中获取浮点数的存储格式,然后再自行编写反向生成的函数来进行验证和学习。

其中获取二进制存储的思路是用&(位与)运算符获取各位的二进制值。

然而,在编写完成的测试阶段遇到了这个问题: error: invalid operands to binary & (have 'float' and 'int')

代码是这么写的:

    ...
    bits[a] = val & 1;
    ...

其中bits为二进制码存储的数组,val为需要解析的浮点数。

经过一番测试,发现&运算符(其实不止,其它的位运算符也一样)的两侧似乎是只能放整形数据的。换句话说,根据个人理解,没有按照自然规则存储的浮点数是不允许进行位操作的。(真正的原因不一定是这个,还请有心人去阅读一下C/C++的官方手册,里面肯定有相关记载)但是,我的目的正是获得并理解这个“非自然的”存储规则。因而,经过在某度上的一番搜索,获得了一个解决思路:让编译器以为它是整形数据,并让它按照整形的规则进行读取。显然对数据进行类型转换是不行的,这样会直接改变它的存储方式。于是采取退而求其次的方法:指针。让编译后的代码按照整形的规则去读取浮点型的数据,其并不会检测内存中的数据类型,因而成功获得了目标数据。

代码更改如下:

    ...
    int *float_bits = (int*)&val;
    ...
    bits[a] = *float_bits & 1;
    ...

编译时未见报错,运行,成功获得期望数据。

参考链接:https://zhidao.baidu.com/question/533618345.html

网络有一大坏处,就是自由传播。尤其是在需要专业知识的领域,总有一些媒体自以为是,觉得网络上“大多认同”的观点即为正确观点,然后就写文章出来给大众看。懂的人看到了还好,至少不会受到其影响,嗤之以鼻而已;不懂的人看到了,“如获至宝”,对这“科普作者”很是感激。而正是懂行的人不愿意也不必对这些错误的东西进行纠正,才导致这些错误观点到处泛滥,以至于最后竟然到明白人面前班门弄斧。

让在下有感而发地写出这段措辞锋利的文字的,正是本次的主题,寻找Windows平台下的C/C++编译器。非科班人士对编程自然了解不多,编辑编译不分,看到“编辑器”,“IDE”可以写代码就一拍大腿,“哦!是这样啊!”,便把DEV-C++,VS等不是编译器的东西拿来瞎扯。tmd在网络上逛了一圈,清一色的DEV-C++,VS。(DEV-C++为编辑器,而VS为集成开发环境,是一套软件,包含了编辑器和编译器在内)。你怎么不说说JB家的CLion呢?Eclipse Cpp呢?都能写C/C++,咋没看见你提呢?

瞎BB了一大堆,接下来进入正题。就先简略地罗列一下吧,毕竟明天还要早起。

MinGW (Codeblocks默认搭档)
MinGW-w64
TDM-GCC (DEV-C++默认搭档)
Microsoft Visual C++ (MSVC, 是Microsoft Visual Studio的组件)
Intel C++ Compiler
DigitalMars (听过,暂时还没用过)
差点忘了,还有个有意思的Clang+LLVM组合

引用自: https://blog.csdn.net/TimEckel/article/details/77387500 该文并没有著名其原文的具体出处,就贴了个用户名

大概是ld没配置好的原因

ld的配置文件环境里加入以下几行:

/usr/local/lib64
/usr/local/lib
/usr/lib64
/usr/lib

推荐在/etc/ld.so.conf.d/里新建一个conf文件,然后写入以上几行 (在下用的是Intel C Compiler, 故取icc.conf

然后ldconfig -v重新配置动态链接库即可。