《Unix环境高级编程》第三版源代码编译报错汇总(WSL)

news2024/12/22 19:31:05

文章目录

      • Error: unable to disambiguate: -dylib (did you mean --dylib ?)
      • undefined reference to `major'
      • error: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?
      • error: ‘FILE’ has no member named ‘_flag’; did you mean ‘_flags’?
      • error: ‘FILE’ has no member named ‘_base’, ‘_ptr’
      • /usr/bin/ld: cannot find -lbsd: No such file or directory
      • 后续
    • 参考

下载这本书《Advanced Programming in the UNIX Environment》的源代码,解压后的文件夹名字为apue.3e,然后使用make编译,遇到的各种问题汇总

Error: unable to disambiguate: -dylib (did you mean --dylib ?)

请参考笔者的另一篇博文:WSL中/usr/bin/ld: Error: unable to disambiguate: -dylib (did you mean --dylib ?)解决方案

undefined reference to `major’

遇到问题:

making filedir
make[1]: Entering directory '/mnt/d/lishizheng/apue/apue.3e/filedir'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  access.c -o access  -L../lib -lapue 
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  cdpwd.c -o cdpwd  -L../lib -lapue 
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  changemod.c -o changemod  -L../lib -lapue 
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  devrdev.c -o devrdev  -L../lib -lapue 
devrdev.c: In function ‘main’:
devrdev.c:19:39: warning: implicit declaration of function ‘major’ [-Wimplicit-function-declaration]
   19 |                 printf("dev = %d/%d", major(buf.st_dev),  minor(buf.st_dev));
      |                                       ^~~~~
devrdev.c:19:59: warning: implicit declaration of function ‘minor’ [-Wimplicit-function-declaration]
   19 |                 printf("dev = %d/%d", major(buf.st_dev),  minor(buf.st_dev));
      |                                                           ^~~~~
/usr/bin/ld: /tmp/ccASensu.o: in function `main':
devrdev.c:(.text+0xcb): undefined reference to `minor'
/usr/bin/ld: devrdev.c:(.text+0xe1): undefined reference to `major'
/usr/bin/ld: devrdev.c:(.text+0x131): undefined reference to `minor'
/usr/bin/ld: devrdev.c:(.text+0x147): undefined reference to `major'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:18: devrdev] Error 1
make[1]: Leaving directory '/mnt/d/lishizheng/apue/apue.3e/filedir'
make: *** [Makefile:6: all] Error 1

解决方法
打开devrdev.c文件,在#endif下面添加#include <sys/sysmacros.h>头文件,然后再执行make编译。
在这里插入图片描述
sys/sysmacros.h 的介绍
sys/sysmacros.h 头文件包含了一些宏(macros)和函数原型,通常用于处理文件系统相关的信息。这个头文件在 POSIX 操作系统(包括Linux)上比较常见。下面是一些可能包含在 sys/sysmacros.h 头文件中的内容:

  1. 宏定义:

    • major(dev):从设备号中提取主设备号。
    • minor(dev):从设备号中提取次设备号。
    • makedev(major, minor):根据主次设备号创建设备号。
  2. 函数原型:

    • dev_t makedev(int major, int minor):根据主次设备号创建设备号。这个函数的功能类似于宏 makedev

这些宏和函数通常用于解析设备号,这在处理设备文件和文件系统时可能很有用。设备号是一个整数,包含主设备号和次设备号,用于唯一标识设备。这些宏和函数使得从设备号中提取主次设备号更加方便。

请注意,具体的宏和函数可能会因系统而异。在编写代码时,最好查看相关平台的文档,以确保正确使用这些宏和函数。

error: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?

遇到问题

making stdio
make[1]: Entering directory '/mnt/d/lishizheng/apue/apue.3e/stdio'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  buf.c -o buf  -L../lib -lapue 
buf.c: In function ‘is_unbuffered’:
buf.c:90:15: error: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?
   90 | #define _flag __pad[4]
      |               ^~~~~
buf.c:98:20: note: in expansion of macro ‘_flag’
   98 |         return(fp->_flag & _IONBF);
      |                    ^~~~~
buf.c: In function ‘is_linebuffered’:
buf.c:90:15: error: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?
   90 | #define _flag __pad[4]
      |               ^~~~~
buf.c:104:20: note: in expansion of macro ‘_flag’
  104 |         return(fp->_flag & _IOLBF);
      |                    ^~~~~
buf.c: In function ‘buffer_size’:
buf.c:92:15: error: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?
   92 | #define _base __pad[2]
      |               ^~~~~
buf.c:111:20: note: in expansion of macro ‘_base’
  111 |         return(fp->_base - fp->_ptr);
      |                    ^~~~~
buf.c:91:14: error: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?
   91 | #define _ptr __pad[1]
      |              ^~~~~
buf.c:111:32: note: in expansion of macro ‘_ptr’
  111 |         return(fp->_base - fp->_ptr);
      |                                ^~~~
buf.c: In function ‘is_unbuffered’:
buf.c:99:1: warning: control reaches end of non-void function [-Wreturn-type]
   99 | }
      | ^
buf.c: In function ‘is_linebuffered’:
buf.c:105:1: warning: control reaches end of non-void function [-Wreturn-type]
  105 | }
      | ^
buf.c: In function ‘buffer_size’:
buf.c:115:1: warning: control reaches end of non-void function [-Wreturn-type]
  115 | }
      | ^
make[1]: *** [Makefile:16: buf] Error 1
make[1]: Leaving directory '/mnt/d/lishizheng/apue/apue.3e/stdio'
make: *** [Makefile:6: all] Error 1

解决方案
删除这5行

#ifdef _LP64
#define _flag __pad[4]
#define _ptr __pad[1]
#define _base __pad[2]
#endif

如下图所示
在这里插入图片描述
然后make遇到如下的问题

error: ‘FILE’ has no member named ‘_flag’; did you mean ‘_flags’?

遇到问题

making stdio
make[1]: Entering directory '/mnt/d/lishizheng/apue/apue.3e/stdio'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  buf.c -o buf  -L../lib -lapue 
buf.c: In function ‘is_unbuffered’:
buf.c:94:20: error: ‘FILE’ has no member named ‘_flag’; did you mean ‘_flags’?
   94 |         return(fp->_flag & _IONBF);
      |                    ^~~~~
      |                    _flags
buf.c: In function ‘is_linebuffered’:
buf.c:100:20: error: ‘FILE’ has no member named ‘_flag’; did you mean ‘_flags’?
  100 |         return(fp->_flag & _IOLBF);
      |                    ^~~~~
      |                    _flags
buf.c: In function ‘buffer_size’:
buf.c:107:18: error: ‘FILE’ has no member named ‘_base’
  107 |         return(fp->_base - fp->_ptr);
      |                  ^~
buf.c:107:30: error: ‘FILE’ has no member named ‘_ptr’
  107 |         return(fp->_base - fp->_ptr);
      |                              ^~
buf.c: In function ‘is_unbuffered’:
buf.c:95:1: warning: control reaches end of non-void function [-Wreturn-type]
   95 | }
      | ^
buf.c: In function ‘is_linebuffered’:
buf.c:101:1: warning: control reaches end of non-void function [-Wreturn-type]
  101 | }
      | ^
buf.c: In function ‘buffer_size’:
buf.c:111:1: warning: control reaches end of non-void function [-Wreturn-type]
  111 | }
      | ^
make[1]: *** [Makefile:16: buf] Error 1
make[1]: Leaving directory '/mnt/d/lishizheng/apue/apue.3e/stdio'
make: *** [Makefile:6: all] Error 1

解决方法
将下面代码中的flag修改为flags

#elif defined(_IONBF)



ints
is_unbuffered(FILE *fp)
{
	return(fp->_flags & _IONBF);  //修改此处
}

int
is_linebuffered(FILE *fp)
{s
	return(fp->_flags & _IOLBF);  // 修改此处
}

int
buffer_size(FILE *fp)
{
#ifdef _LP64
	return(fp->_base - fp->_ptr);
#else
	return(BUFSIZ);	/* just a guess */
#endif
}

#else

#error unknown stdio implementation!

#endif

修改的位置如下图所示
在这里插入图片描述
然后发现报错

error: ‘FILE’ has no member named ‘_base’, ‘_ptr’

making stdio
make[1]: Entering directory '/mnt/d/lishizheng/apue/apue.3e/stdio'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  buf.c -o buf  -L../lib -lapue 
buf.c: In function ‘buffer_size’:
buf.c:107:18: error: ‘FILE’ has no member named ‘_base’
  107 |         return(fp->_base - fp->_ptr);
      |                  ^~
buf.c:107:30: error: ‘FILE’ has no member named ‘_ptr’
  107 |         return(fp->_base - fp->_ptr);
      |                              ^~
buf.c:111:1: warning: control reaches end of non-void function [-Wreturn-type]
  111 | }
      | ^
make[1]: *** [Makefile:16: buf] Error 1
make[1]: Leaving directory '/mnt/d/lishizheng/apue/apue.3e/stdio'
make: *** [Makefile:6: all] Error 1

解决方法
替换这里:

return(fp->_base - fp->_ptr);

替换为

return(fp->_IO_buf_end - fp->_IO_buf_base);

未修改之前如下图:
在这里插入图片描述
修改之后如下图:
在这里插入图片描述

/usr/bin/ld: cannot find -lbsd: No such file or directory

遇到问题

making threadctl
make[1]: Entering directory '/mnt/d/lishizheng/apue/apue.3e/threadctl'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  atfork.c -o atfork  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  suspend.c -o suspend  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o detach.o detach.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o getenv1.o getenv1.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o getenv2.o getenv2.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o getenv3.o getenv3.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o timeout.o timeout.c
timeout.c: In function ‘main’:
timeout.c:119:12: warning: ‘condition’ may be used uninitialized [-Wmaybe-uninitialized]
  119 |         if (condition) {
      |            ^
timeout.c:125:48: warning: ‘arg’ may be used uninitialized [-Wmaybe-uninitialized]
  125 |                 timeout(&when, retry, (void *)((unsigned long)arg));
      |                                               ~^~~~~~~~~~~~~~~~~~~
make[1]: Leaving directory '/mnt/d/lishizheng/apue/apue.3e/threadctl'
making threads
make[1]: Entering directory '/mnt/d/lishizheng/apue/apue.3e/threads'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  badexit2.c -o badexit2  -L../lib -lapue -pthread -lrt -lbsd
/usr/bin/ld: cannot find -lbsd: No such file or directory
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:31: badexit2] Error 1
make[1]: Leaving directory '/mnt/d/lishizheng/apue/apue.3e/threads'
make: *** [Makefile:6: all] Error 1

解决方法

sudo apt-get install -y libbsd-dev

会安装 libbsd-devlibmd-dev

后续

继续make,会遇到sprintf的警告,可以不用管。

making printer
make[1]: Entering directory '/mnt/d/lishizheng/apue/apue.3e/printer'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o print.o print.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o util.o util.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  -o print print.o util.o ../sockets/clconn2.o  -L../lib -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o printd.o printd.c
printd.c: In function ‘build_qonstart’:
printd.c:362:39: warning:%s’ directive writing up to 255 bytes into a region of size 40 [-Wformat-overflow=]
  362 |                 sprintf(fname, "%s/%s/%s", SPOOLDIR, REQDIR, entp->d_name);
      |                                       ^~
printd.c:362:17: note: ‘sprintf’ output between 25 and 280 bytes into a destination of size 64
  362 |                 sprintf(fname, "%s/%s/%s", SPOOLDIR, REQDIR, entp->d_name);
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
printd.c:375:47: warning:%s’ directive writing up to 255 bytes into a region of size 40 [-Wformat-overflow=]
  375 |                         sprintf(fname, "%s/%s/%s", SPOOLDIR, DATADIR,
      |                                               ^~
printd.c:375:25: note: ‘sprintf’ output between 25 and 280 bytes into a destination of size 64
  375 |                         sprintf(fname, "%s/%s/%s", SPOOLDIR, DATADIR,
      |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  376 |                           entp->d_name);
      |                           ~~~~~~~~~~~~~
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  -o printd printd.o util.o ../sockets/clconn2.o ../sockets/initsrv2.o \
                 -L../lib -L../lib -lapue -pthread
make[1]: Leaving directory '/mnt/d/lishizheng/apue/apue.3e/printer'

最后编译成功的样子

making exercises
make[1]: Entering directory '/mnt/d/lishizheng/apue/apue.3e/exercises'
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  bo.c -o bo  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  fifo1.c -o fifo1  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  getlogin.c -o getlogin  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  goodexit.c -o goodexit  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  longpath.c -o longpath  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  pendlock.c -o pendlock  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  prtime.c -o prtime  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  sizepipe.c -o sizepipe  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  vfork3.c -o vfork3  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  zombie.c -o zombie  -L../lib -lapue -pthread
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o asyncsocket.o asyncsocket.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o openmax.o openmax.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o sleep.o sleep.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o sleepus_poll.o sleepus_poll.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE   -c -o sleepus_select.o sleepus_select.c
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  getpwsvr4.c -o getpwsvr4  -L../lib -lapue -pthread
make[1]: Leaving directory '/mnt/d/lishizheng/apue/apue.3e/exercises'

参考

[1]《Unix环境高级编程》第三版源代码在CentOS 7、Ubuntu 20.04和Ubuntu 22.04上编译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1394455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AAAI 2024 | TEx-Face,5秒内按需生成照片级3D人脸

本文介绍一篇来自浙江大学ReLER实验室的工作&#xff0c;"Controllable 3D Face Generation with Conditional Style Code Diffusion"&#xff0c;目前该文已被AAAI 2024录用。 论文题目&#xff1a; Controllable 3D Face Generation with Conditional Style Code D…

(C语言)冒泡排序

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现buble_sort函数&#xff1b; void buble_sort(int arr[], int sz) {//初始化变量值&#xff1b;int i 0;//嵌套循环冒泡排序&#xff1b;//外层循环&…

adb、monkey的下载和安装

adb下载 官网网址&#xff1a;Downloads - ADB Shell 尽量不要下载最新的ADB Kits&#xff0c;因为兼容性可能不太好。 点击下载 ADB Kits 作者下载的版本是1.0.36 解压adb 到指定的目录即可。 然后把adb配置 环境变量。 检查adb是否安装成功

android 自定义八边形进度条

自定义八边形动画效果图如下 绘制步骤&#xff1a; 1.先绘制橙色底部八边形实心 2.黑色画笔绘制第二层&#xff0c;让最外层显示一条线条宽度即可 3.再用黄色画笔绘制黄色部分 4.使用渐变画笔根据当前进度绘制覆盖黄色部分 5.使用黑色画笔根据当前进度绘制刻度条 6.黑色画笔绘制…

C语言经典练习3——[NOIP2008]ISBN号码与圣诞树

前言 在学习C语言的过程中刷题是很重要的&#xff0c;俗话说眼看千遍不如手动一遍因为在真正动手去刷题的时候会暴露出更多你没有意识到的问题接下来我就为各位奉上两道我认为比较有代表性的题 1. [NOIP2008]ISBN号码 1.1 题目描述 每一本正式出版的图书都有一个ISBN号码与之对…

BKP备份寄存器读取

1.简介&#xff1a; BKP&#xff08;Backup&#xff09;备份寄存器是一种特殊的功能寄存器&#xff0c;用于存储某些设备的备份数据。这些数据通常是非常重要的&#xff0c;因此需要定期备份以防止意外丢失。 具体来说&#xff0c;BKP寄存器可以用于以下几种情况&#xff1a;…

100天精通鸿蒙从入门到跳槽——第6天:TypeScript 知识储备:类

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

保留图片原画质图片无损放大

在数字时代&#xff0c;图片的放大和缩放是常见的操作。然而&#xff0c;传统的图片放大方法往往会导致图片质量的损失&#xff0c;使得图片的细节和清晰度降低。为了解决这个问题&#xff0c;水印云推出了一项新的功能——无损放大&#xff0c;让你可以在不损失图片质量的情况…

精选100 GPTs深度解析专题

精选100 GPTs深度解析专题 背景 1月10日&#xff0c;GPT应用商店&#xff08;GPT Store&#xff09;的正式上线&#xff0c;GPT技术的应用已经呈现爆炸性增长。目前&#xff0c;市场上已经出现了超过300万种GPTs&#xff0c;应用领域涵盖图像生成、写作、效率提升、研究分析、编…

部署Sqli-labs靶场:一篇文章解析全过程

部署Sqli-labs靶场&#xff1a;一篇文章解析全过程 0x01 前言 Sqli-labs是一个在线的SQL注入练习平台&#xff0c;提供了一系列关卡供用户练习SQL注入的技巧和防范方法。在这个平台上&#xff0c;用户可以尝试注入攻击&#xff0c;并测试自己的技能和工具&#xff0c;同时也可…

python数字图像处理基础(六)——模板匹配、直方图

目录 模板匹配概念单对象模板匹配多对象模板匹配 直方图1.查找直方图2.绘制直方图3.掩膜的应用 模板匹配 概念 模板匹配和卷积原理很像&#xff0c;模板在原图像上从原点开始滑动&#xff0c;计算模板与图像被模板覆盖的地方的差别程度&#xff0c;这个差别程度的计算方法在o…

CS8370错误,这是由于使用了C# 7.3中不支持的功能

目录 背景: 第一种方法: 第二种办法: 背景: 在敲代码的时候&#xff0c;程序提示报错消息提示:CS8370错误&#xff0c;那么这是什么原因导致的&#xff0c;这是由于使用了C# 7.3中不支持的功能&#xff0c;不支持该功能&#xff0c;那就是版本太低我们就需要升级更高的版本&…

DAY03_Spring—自动装配注解模式优化XML文件

目录 1 Spring注解模式1.1 自动装配1.1.1 说明1.1.2 配置规则 1.2 注解模式1.2.1 关于注解的说明1.2.2 注解使用原理1.2.3 编辑配置文件1.2.4 属性注解 1.3 实现MVC结构的纯注解开发1.3.1 编写java代码1.3.2 编辑xml配置文件1.3.3 编写测试类1.3.4 关于注解说明1.3.5 关于Sprin…

python对自动驾驶进行模拟

使用了 Pygame 库来创建一个简单的游戏环境,模拟了一辆自动驾驶汽车在道路上行驶。汽车的位置和速度通过键盘控制&#xff0c;可以左右移动和加速减速。道路的宽度和颜色可以根据需要进行调整。 import pygame import random # 游戏窗口大小 WINDOW_WIDTH 800 WINDOW_HEIG…

3dmax中怎么在模型上开洞?

3dmaxS是Autodesk公司开发的基于PC系统的三维动画渲染和制作软件。我们可以使用它来做各种模型。那么怎么在模型上开洞呢&#xff1f;我们一起来看看吧&#xff01; 1、首先我们打开我们的3damx&#xff0c;这里面我使用的版本为3damxs2012,虽然版本可能各不相同。但是功能并没…

原生SSM整合(Spring+SpringMVC+MyBatis)案例

SSM框架是Spring、Spring MVC和MyBatis三个开源框架的整合&#xff0c;常用于构建数据源较简单的web项目。该框架是Java EE企业级开发的主流技术&#xff0c;也是每一个java开发者必备的技能。下面通过查询书籍列表的案例演示SSM整合的过程. 新建项目 创建文件目录 完整文件结…

拼多多无货源中转仓项目真的靠谱吗?发展前景如何?

阿阳最近一直在关注无货源电商这一块&#xff0c;尤其是拼多多无货源中转仓&#xff0c; 现如今也有了自己的运营团队和交付团队&#xff0c;整体来看这个项目还算不错&#xff01; 说实话&#xff0c;在考察这个项目的时候&#xff0c;看到市面上很多人在做&#xff0c;包括我…

JavaScript 类型判断及类型转换规则

文章目录 JavaScript 类型及其判断使用 typeof 判断类型使用 instanceof 判断类型使用 constructor 和 Object.prototype.toString 判断类型JavaScript 类型及其转换JavaScript 函数参数传递cannot read property of undefined 问题解决方案分析一道网红题目JavaScript 类型判断…

【GAMES101】Lecture 08 着色-Blinn-Phong反射模型

目录 Blinn-Phong反射模型-高光 Blinn-Phong反射模型-环境光照 Blinn-Phong反射模型 Blinn-Phong反射模型-高光 我们在lecture7的时候讲了这个Blinn-Phong反射模型的漫反射部分&#xff0c;现在我们继续讲Blinn-Phong反射模型的高光部分 这个高光是怎么产生的呢&#xff0…

} expected.Vetur(1005)

typescript TS 错误码大全&#xff01;收藏了 - 环信 } expected.Vetur(1005) 没有补齐} 虽然他给的是最后代码出错了&#xff0c;但可以看看之前的代码有没有红色的{&#xff0c;补齐即可以