文章目录

  • 0. 前言
  • 1. 编译依赖库
    • 1.1 编译libssl
    • 1.2 编译libnl
  • 2. 编译hostapd2.9
  • 3. hostapd2.9的配置和使用
    • 3.1 建立AP热点
    • 3.2 使用wpa_supplicant连接热点
    • 3.3 闲言碎语
  • 4. 为AP添加DHCP支持
    • 4.1 udhcpd
    • 4.2 udhcpc
  • 5. 相关工具
    • 5.1 iw、iwconfig、iwlist...
  • 本文资源共享

0. 前言

截止本文编写,hostapd的最新版本为2.9,本文将尝试交叉编译该软件以期在海思开发板上运行。

本文使用的测试环境为Hi3516DV300(arm-himix200-linux-) + Kubuntu20.04。

编译之前可能需要安装以下软件包:

sudo apt install pkg-config bison flex

编译过程中若有其它缺失的软件包请自行安装,笔者的开发环境装的软件有点繁杂,难以精简出全部所需项目。

1. 编译依赖库

hostap的编译依赖openssl和libnl,因此在编译hostap之前需要首先交叉编译这两个库。

1.1 编译libssl

libssl源码下载地址:https://www.openssl.org/source/。当前使用openssl-1.1.1i。

解压源码包,在其目录下执行:

mkdir _install
./config no-asm no-shared no-async --prefix=$PWD/_install --cross-compile-prefix=arm-himix200-linux-

打开Makefile,搜索并删除“-m64”字段,保存并退出。而后执行:

make CC=arm-himix200-linux-gcc
make install

1.2 编译libnl

libnl提供应用层和驱动之间的IPC通信机制。

libnl源码下载地址:http://www.linuxfromscratch.org/blfs/view/svn/basicnet/libnl.html。当前使用libnl-3.5.0。

解压源码包,在其目录下执行:

mkdir _install
./configure --host=arm-himix200-linux --prefix=$PWD/_install --enable-static
make
make install

2. 编译hostapd2.9

hostapd源码下载地址:Index of wpa_supplicant releases。当前使用hostapd2.9。

解压源码包,在 ./hostapd 目录下执行:

mkdir _install
cp defconfig .config

而后修改 ./hostap/Makefile 文件,添加交叉编译的libssl和libnl路径(路径需要根据库的实际位置进行修改):

[说明]建议使用绝对路径而非相对路径以免参数在不同目录下失效。

CFLAGS += -I/home/wind/Documents/openssl-1.1.1i/_install/include
LIBS   += -L/home/wind/Documents/openssl-1.1.1i/_install/libCFLAGS += -I/home/wind/Documents/libnl-3.5.0/_install/include
LIBS   += -L/home/wind/Documents/libnl-3.5.0/_install/libLIBS   += -pthread -ldl

而后编译并安装:

make CC=arm-himix200-linux-gcc
make install DESTDIR=$PWD/_install/

以上编译结果为动态链接。最后,可使用strip对应用程序进行“瘦身”:

arm-himix200-linux-strip hostapd

使用以下命令获取应用程序依赖的动态运行库:

wind@WKC:~/Documents/Hi3516DV300/hostapd-2.9/hostapd$ arm-himix200-linux-objdump -x hostapd |grep NEEDEDNEEDED               libdl.so.2NEEDED               librt.so.1NEEDED               libnl-3.so.200NEEDED               libnl-genl-3.so.200NEEDED               libpthread.so.0NEEDED               libc.so.6
wind@WKC:~/Documents/Hi3516DV300/hostapd-2.9/hostapd$ arm-himix200-linux-objdump -x hostapd_cli |grep NEEDEDNEEDED               librt.so.1NEEDED               libc.so.6

因此需要保证最终的根文件系统中有这些运行库。

3. hostapd2.9的配置和使用

3.1 建立AP热点

将hostapd复制到开发板端,并建立配置文件,配置文件示例可以从 hostapd/hostapd.conf 修改得到。这里给出精简后的配置文件内容示例。

interface=wlan0
#driver=nl80211
ssid=turix_test_ap
hw_mode=g
channel=10
auth_algs=3
wpa=3#wpa_passphrase=12345678
wpa_psk=4b75eec8944592dec6aa91c32533b011e84a157687d88ee26417536c73f3bd81wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=TKIP CCMP

上述配置文件内容注释如下,以帮助理解基础配置的意义和可选项:

# ----------------------------------------
# 系统显示的接入点设备的名称,不要以ap结尾
# ----------------------------------------
interface=wlan0# ----------------------------------------
# 驱动程序接口类型
# hostap/wired/none/nl80211/bsd
# 默认:hostap
# ----------------------------------------
# driver=hostap# ----------------------------------------
# 独立控制程序接口
# 当需要使用如hostapd_cli等与hostapd连接时
# 需开启此配置。
# ----------------------------------------
# ctrl_interface=/var/run/hostapd# ----------------------------------------
# 设备广播时使用的SSID
# ----------------------------------------
ssid=turix_test_ap# ----------------------------------------
# 设备工作模式
# 默认:IEEE 802.11b
# a=IEEE 802.11a(5GHz)
# b=IEEE 802.11b(2.4GHz)
# g=IEEE 802.11g(2.4GHz),等
# ----------------------------------------
hw_mode=g# ----------------------------------------
# 无线频道数量
# 默认值:0,即未设置
# 注意:某些驱动程序不使用hostapd中的该值,
# 需要使用iwconfig单独配置通道。
# ----------------------------------------
channel=10# ----------------------------------------
# 信标间隔,以kus为单位(1.024 ms)
# 默认值:100
# 范围:15~65535
# ----------------------------------------
# beacon_int=100# ----------------------------------------
# 最大允许连接的STA数量
# IEEE 802.11的限制为不大于2007
# ----------------------------------------
# max_num_sta=20# ----------------------------------------
# 用于选择Hostapd支持的身份验证算法
# bit 0:开放系统身份验证(OSA)
# bit 1:共享秘钥认证(SKA)(需要WEP)
# ----------------------------------------
auth_algs=3# --------------------------------------------------------------------------------
# 启用WPA
# 设置此变量会将AP配置为需要WPA(基于其他配置可能为WPA-PSK或WPA-RADIUS/EAP)。
# 对于WPA-PSK,必须设置wpa_psk或wpa_passphrase,并且wpa_key_mgmt必须包括WPA-PSK。
# wpa_psk/wpa_passphrase之外,wpa_psk_radius可能就足够了。
# 对于WPA-RADIUS/EAP,必须设置ieee8021x(但没有动态WEP密钥),必须配置RADIUS身
# 份验证服务器,并且wpa_key_mgmt中必须包含WPA-EAP。
#
# 该字段是一个位字段,可用于启用WPA(IEEE 802.11i/D3.0)和/或WPA2(完整的IEEE 802.11i/RSN):
# bit0 = WPA
# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
#
# 请注意,WPA3也使用bit1进行配置,因为它与WPA2一样使用RSN。
# 换言之,对于WPA3,使用wpa=2
# (WPA3-Personal使用wpa_key_mgmt=SAE而不是wpa_key_mgmt=WPA-PSK)。
# --------------------------------------------------------------------------------
wpa=2# --------------------------------------------------------------------------------
# WPA-PSK的WPA预共享密钥。
# 可以将其输入为十六进制格式(64个十六进制数字),wpa_psk的256位密钥,
# 也可以输入将转换为PSK的ASCII密码(8~63个字符)。
# 此转换使用SSID,因此当使用ASCII密码短语并更改SSID时,PSK也会更改。
# wpa_psk (dot11RSNAConfigPSKValue)
# wpa_passphrase (dot11RSNAConfigPSKPassPhrase)
# --------------------------------------------------------------------------------
wpa_passphrase=12345678
#wpa_psk=4b75eec8944592dec6aa91c32533b011e84a157687d88ee26417536c73f3bd81# --------------------------------------------------------------------------------
# 一组接受的密钥管理算法(WPA-PSK,WPA-EAP或两者)。条目之间用空格分隔。
# 可以添加WPA-PSK-SHA256和WPA-EAP-SHA256以启用基于SHA256的更强算法。
# WPA-PSK             = WPA-个人 / WPA2-个人
# WPA-PSK-SHA256      = WPA2-个人 使用SHA256
# WPA-EAP             = WPA-企业 / WPA2-企业
# WPA-EAP-SHA256      = WPA2-企业 使用SHA256
# SAE                 = SAE(WPA3-个人)
# WPA-EAP-SUITE-B-192 = WPA3-企业 with 192-bit 安全/CNSA套件
# FT-PSK              = FT with passphrase/PSK
# FT-EAP              = FT with EAP
# FT-EAP-SHA384       = FT with EAP using SHA384
# FT-SAE              = FT with SAE
# FILS-SHA256         = Fast Initial Link Setup with SHA256
# FILS-SHA384         = Fast Initial Link Setup with SHA384
# FT-FILS-SHA256      = FT and Fast Initial Link Setup with SHA256
# FT-FILS-SHA384      = FT and Fast Initial Link Setup with SHA384
# OWE                 = Opportunistic Wireless Encryption (a.k.a. Enhanced Open)
# DPP                 = Device Provisioning Protocol
# OSEN                = Hotspot 2.0 online signup with encryption
# (dot11RSNAConfigAuthenticationSuitesTable)
# --------------------------------------------------------------------------------
wpa_key_mgmt=WPA-PSK# --------------------------------------------------------------------------------
# 成对密钥(单播数据包)的一组可接受的密码套件(加密算法)。这是用空格分隔的算法列表:
# CCMP     = AES in Counter mode with CBC-MAC (CCMP-128)
# TKIP     = Temporal Key Integrity Protocol
# CCMP-256 = AES in Counter mode with CBC-MAC with 256-bit key
# GCMP     = Galois/counter mode protocol (GCMP-128)
# GCMP-256 = Galois/counter mode protocol with 256-bit key
# 基于此配置,将自动选择组密码套件(广播和多播帧的加密算法)。如果仅允许将CCMP作为
# 成对密码,则组密码也将为CCMP。否则,TKIP将用作组密码。可选的group_cipher参数可
# 用于覆盖此自动选择。
# (dot11RSNAConfigPairwiseCiphersTable)
# --------------------------------------------------------------------------------
# WPA(v1)的成对密码(默认: TKIP)
wpa_pairwise=TKIP CCMP
# RSN/WPA2的成对密码(默认: 使用wpa_pairwise的值)
rsn_pairwise=TKIP CCMP

注意:如果需要如支持802.11n、支持AP间快速切换、WiFi直连、国家/区域设置等,请参照实例配置的注释进行修改。此处仅考虑最简单的AP-STA通信。

将上述配置保存在 /etc/hostapd.conf 中,hostapd的启动需要此文件。对该文件内容的中文注释请参见文档附带的hostapd(with notes).conf文件。

如果进行简单的修改,请注意几点:

  • wpa_passphrase用于设置明文格式(ASCII,8~63位)的密码;wpa_psk用于设置密文格式的密码;需要注意的是:计算出来的PSK是和SSID相关的;

    PSK计算网站:Wireshark · WPA PSK Generator

  • 对于WPA3,使用wpa=2(WPA3-Personal使用wpa_key_mgmt=SAE而不是wpa_key_mgmt=WPA-PSK)。

测试时使用RT3070作为AP网卡,需开启内核对无线网络的支持和对RT3070的支持。而后执行以下命令运行hostapd:

/ # hostapd /etc/hostapd.conf &
Configuration file: /etc/hostapd.conf
IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
Using interface wlan0 with hwaddr 70:f1:1c:26:07:dd and ssid "turix_test_ap"
IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED

如果出现随机数获取问题,可考虑替换随机数发生器:

mv /dev/random /dev/random.bak
ln -s /dev/urandom /dev/random

3.2 使用wpa_supplicant连接热点

wpa_supplicant的编译过程见:《wpa_supplicant2.9编译过程》

wpa_supplicant的配置文件内容示例为:

network={ssid="turix_test_ap"key_mgmt=WPA-PSKpsk="12345678"
}

可参考以下命令进行连接:

wpa_supplicant -D wext -i wlan0 -c /etc/wpa.conf &

3.3 闲言碎语

一些网卡或驱动对AP模式的支持不好,可能导致无法建立AP热点或AP热点建立后不能连接的问题。测试中使用的RTL8188EUS、RTL8188ETV、RTL8192EU在内核(Linux4.9.37)自带的驱动下无法建立热点,提示以下信息:

# ----------RTL8192EU----------
Configuration file: /etc/hostapd.conf
IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
nl80211: Could not configure driver mode
nl80211: deinit ifname=wlan0 disabled_11b_rates=0
nl80211 driver initialization failed.
wlan0: interface state UNINITIALIZED->DISABLED
wlan0: AP-DISABLED
wlan0: CTRL-EVENT-TERMINATING
hostapd_free_hapd_data: Interface wlan0 wasn't started# ----------RTL8188EUS/RTL8188ETV----------
Configuration file: /etc/hostapd.conf
nl80211: Driver does not support authentication/association or connect commands
nl80211: deinit ifname=wlan0 disabled_11b_rates=0
nl80211 driver initialization failed.
wlan0: interface state UNINITIALIZED->DISABLED
wlan0: AP-DISABLED
wlan0: CTRL-EVENT-TERMINATING
hostapd_free_hapd_data: Interface wlan0 wasn't started

RTL8188CUS虽然可以建立热点,但STA连接该热点时会出现身份认证失败的问题。

# ----------RTL8188CUS----------
Configuration file: /etc/hostapd.conf
rtl8192cu: MAC auto ON okay!
rtl8192cu: Tx queue select: 0x05
IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
Using interface wlan0 with hwaddr 00:13:ef:f1:01:3d and ssid "turix_test_ap"
IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
# ----------WPA连接开始----------
wlan0: STA b0:d5:9d:00:36:48 IEEE 802.11: authenticated
wlan0: STA b0:d5:9d:00:36:48 IEEE 802.11: associated (aid 1)
wlan0: STA b0:d5:9d:00:36:48 IEEE 802.11: authenticated
wlan0: STA b0:d5:9d:00:36:48 IEEE 802.11: associated (aid 1)
...

此时WPA端提示的错误为:

# ----------wpa_supplicant use RTL8188EUS----------
RTL871X: survey done event(28)
wlan0: Trying to associate with 00:13:efRTL871X: wpa_set_auth_algs, AUTH_ALG_OPEN_SYSTEM
:f1:01:3d (SSID='turix_test_ap' freq=245RTL871X: set_mode = IW_MODE_INFRA
7 MHz)
RTL871X: wpa_ie(length:22):
RTL871X: 0x30 0x14 0x01 0x00 0x00 0x0f 0xac 0x02
RTL871X: 0x01 0x00 0x00 0x0f 0xac 0x04 0x01 0x00
RTL871X: 0x00 0x0f 0xac 0x02 0x00 0x00 0x40 0xc1
RTL871X: hw_var_set_opmode()-3361 mode = 2
RTL871X: SetHwReg8188EU, 4069, RCR= 700060ca
RTL871X: =>rtw_wx_set_essid
RTL871X: ssid=turix_test_ap, len=13
RTL871X: set ssid [turix_test_ap] fw_state=0x00000008
RTL871X: Set SSID under fw_state=0x00000008
RTL871X: [by_bssid:0][assoc_ssid:turix_test_ap][to_roaming:0] new candidate: turix_test_ap(00:13:ef:f1:01:3d) rssi:-53
RTL871X: rtw_select_and_join_from_scanned_queue: candidate: turix_test_ap(00:13:ef:f1:01:3d, ch:10)
RTL871X: link to new AP
RTL871X: rtw_joinbss_cmd: smart_ps=2
RTL871X: <=rtw_wx_set_essid, ret 0
RTL871X: set bssid:00:13:ef:f1:01:3d
RTL871X: Set BSSID under fw_state=0x00000088
RTL871X: update_mgnt_tx_rate(): rate = 2
RTL871X: link to new AP
RTL871X: issue_deauth to 00:13:ef:f1:01:3d
RTL871X: start auth
RTL871X: issue_auth
RTL871X: OnAuthClient
RTL871X: auth success, start assoc
RTL871X: network.SupportedRates[0]=82
RTL871X: network.SupportedRates[1]=84
RTL871X: network.SupportedRates[2]=0B
RTL871X: network.SupportedRates[3]=16
RTL871X: bssrate_len = 4
RTL871X: OnAssocRsp
RTL871X: report_join_res(1)
RTL871X: rtw_joinbss_update_network
RTL871X: rtw_joinbss_update_stainfo
RTL871X: ### Set STA_(0) info
RTL871X: assoc success
wlan0: Associated with 00:13:ef:f1:01:3d
RTL871X: send eapol packet
RTL871X: HW_VAR_BASIC_RATE: BrateCfg(0xf)
RTL871X: HTOnAssocRsp
UpdateHalRAMask8188EUsb => mac_id:0, networkType:0x01, mask:0x0000000f==> rssi_level:0, rate_bitmap:0x0000000d
RTL871X: ### MacID(0),Set Max Tx RPT MID(1)
RTL871X: ### rtl8188e_set_FwMediaStatus_cmd: MStatus=1 MACID=0
RTL871X: rtl8188e_set_FwJoinBssReport_cmd mstatus(1)
RTL871X: SetFwRsvdPagePkt
RTL871X: SetFwRsvdPagePkt: Set RSVD page location to Fw
RTL871X: rtl8188e_set_FwJoinBssReport_cmd: 1 Download RSVD success! DLBcnCount:1, poll:1
RTL871X: Set RSVD page location to Fw.
RTL871X: =>mlmeext_joinbss_event_callback
RTL871X: send eapol packet
UpdateHalRAMask8188EUsb => mac_id:0, networkType:0x01, mask:0x0000000f==> rssi_level:2, rate_bitmap:0x0000000d
RTL871X: send eapol packet
RTL871X: send eapol packet
RTL871X: OnDeAuth Reason code(2)
RTL871X: sta recv deauth reason code(2) sta:00:13:ef:f1:01:3d
RTL871X: receive_disconnect
RTL871X: report_del_sta_event: delete STA, mac_id=0
RTL871X: rtw_stadel_event_callback(mac_id=0)=00:13:ef:f1:01:3d
RTL871X: ### rtl8188e_set_FwMediaStatus_cmd: MStatus=0 MACID=0
RTL871X: update_mgnt_tx_rate(): rate = 2
RTL871X: HW_VAR_BASIC_RATE: BrateCfg(0x15f)
RTL871X: ### Clean STA_(0) info
RTL871X: indicate disassoc
RTL871X: rtl8188e_set_FwJoinBssReport_cmd mstatus(0)
wlan0: WPA: 4-Way Handshake failed - pre-shared key may be incorrect
wlan0: CTRL-EVENT-DISCONNECTED bssid=00:13:ef:f1:01:3d reason=0

同样的配置,使用RT3070的网卡则不会出现这样的问题。本文重在关注流程,因此后续基于RT3070网卡进行测试。

4. 为AP添加DHCP支持

在上文中,虽然通信双方建立了WiFi连接,但通信需要手动配置IP方能进行。DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)用于管理局域网中的IP地址分配,从而简化客户端动态联网过程。和hostapd/wpa_supplicant一样,想要使用DHCP需要在通信双方分别部署DHCP服务端(dhcpd)(或使用独立的DHCP服务器,本文略过)和DHCP客户端(dhcpcd)。

dhcpd源码下载地址:https://www.isc.org/dhcp/

dhcpcd源码下载地址:https://www.linuxfromscratch.org/blfs/view/9.0-systemd/basicnet/dhcpcd.html

busybox中也自带精简的udhcpd/udhcpc,可在编译选项中主动将其打开。它的独立版本下载地址为:https://udhcp.busybox.net/,这里以busybox自带的DHCP服务器/客户端为例,简述使用流程。假设读者已经在busybox中开启了相关选项,并下载到开发板。

另外DHCP也需要Kernel支持,具体配置过程此处忽略。

4.1 udhcpd

建立配置文件 /etc/udhcpd.conf ,文件内容可参照busybox源码中给出的示例 examples/udhcpd.conf 进行配置,例如:

start           192.168.0.100
end             192.168.0.254interface       wlan0

这样的配置仅给出了地址池和被管理设备,但也能用>v<。使用以下命令启动udhcpd守护进程:

udhcpd /etc/udhcpd.conf

4.2 udhcpc

将busybox源码目录下的 examples/simple.script 拷贝到目标开发板的**/usr/share/default.script** ,并赋予其可执行权限

联网后,使用以下命令为某联网设备获取并自动更新IP地址:

/ # udhcpc -i wlan0 -b
udhcpc (v1.20.2) started
Setting IP address 0.0.0.0 on wlan0
Sending discover...
Sending select for 192.168.1.118...
Lease of 192.168.1.118 obtained, lease time 7200
Setting IP address 192.168.1.118 on wlan0
Deleting routers
route: SIOCDELRT: No such process
Adding router 192.168.1.253
Recreating /etc/resolv.confAdding DNS server 210.47.0.1Adding DNS server 211.141.0.99

如果没有实用脚本,udhcpc将仅获取IP地址,无法进行配置等任务。由上述打印结果可知,默认路由和DNS信息也一并被设置了。此时可直接对网址进行ping操作。

/ # ping cn.bing.com
PING cn.bing.com (202.89.233.101): 56 data bytes
64 bytes from 202.89.233.101: seq=0 ttl=115 time=23.293 ms
64 bytes from 202.89.233.101: seq=1 ttl=115 time=27.998 ms
...

5. 相关工具

5.1 iw、iwconfig、iwlist…

iw是Linux上的一款无线网络配置工具。下载地址:https://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git

iw依赖libnl库,因此本节在前文编译好libnl的基础上进行。首先需要引出libnl的pkgconfig位置:

export PKG_CONFIG_PATH=/home/wind/Documents/Hi3516DV300/libnl-3.5.0/_install/lib/pkgconfig

而后执行:

make CC=arm-himix200-linux-gcc

即可在目录下生成iw可执行文件,拷贝到开发板目录中即可。

同样的步骤可编译wireless-tools,并将生成的ifrename、iwconfig、iwevent、iwgetid、iwlist、iwpriv、iwspy和动态链接库libiw.so.29文件拷贝到开发板相应目录下即可。

说明:由于Wireless-Tools是基于Linux Wireless Extension工作的,因此建议使用基于nl80211的iw替代wireless-tools。

本文资源共享

百度网盘链接: https://pan.baidu.com/s/1jG6C5QbZep9UCrsU2I-JPQ

提取码: 0hou

————2021-3-9~4-26@燕卫博————

hostapd2.9编译过程相关推荐

  1. Compiler编译过程

    Compiler编译过程 1.原理 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做"本地"编译器.另外,编译器也可以生成 ...

  2. C C++的编译过程详解

    C/C++编译过程 C/C++编译过程主要分为4个过程 1) 编译预处理 2) 编译.优化阶段 3) 汇编过程 4) 链接程序 一.编译预处理 (1)宏定义指令,如#define Name Token ...

  3. OpenBLAS简介及在Windows7 VS2013上源码的编译过程

    OpenBLAS(Open Basic Linear Algebra Subprograms)是开源的基本线性代数子程序库,是一个优化的高性能多核BLAS库,主要包括矩阵与矩阵.矩阵与向量.向量与向量 ...

  4. Dlib简介及在windows7 vs2013编译过程

    Dlib是一个C++库,包含了许多机器学习算法.它是跨平台的,可以应用在Windows.Linux.Mac.embedded devices.mobile phones等.它的License是Boos ...

  5. Tesseract-OCR 3.04在Windows7 vs2013上编译过程

    从https://github.com/tesseract-ocr/tesseract下载最新源码,commit id: 86acff5, 2016.06.07. 里面有个vs2010目录,用vs20 ...

  6. golang源码分析:编译过程词法解析的流程

    golang编译 由于golang作为静态语言,当使用go build时就会生成对应的编译完成之后的文件,那这个编译过程大致会做什么事情呢,在golang中的编译大致有哪些流程. golang示例代码 ...

  7. 反编译与反汇编、C++编译过程,包括预编译--汇编--编译--链接

    参考:C/C++程序编译流程(预处理->编译->汇编->链接) - ProLyn - 博客园 反汇编和反编译的区别_代码小卒_新浪博客 反汇编与反编译: 汇编:是把汇编源程序转变为目 ...

  8. 编译是检查C语言什么的错误,c语言编译过程

    本文概述 什么是汇编? 编译是将源代码转换为目标代码的过程.这是在编译器的帮助下完成的.编译器检查源代码中的语法或结构错误,如果源代码无错误,则编译器将生成目标代码. c编译过程将作为输入的源代码转换 ...

  9. 编译选项_HarmonyOS编译过程

    导读 全文约1300字,阅读约需要4分钟: 编译选项: 编译过程: 在上一篇<HarmonyOS初体验>中,我们通过 python build.py wifiiot 完成了Hi3861开发 ...

最新文章

  1. win7为什么打开桌面上的计算机很卡很慢,windows7很卡怎么处理_windows7系统卡慢的解决方法...
  2. rfc垮端口 sap_SAP扫盲系列之二:SAP ABAP应用服务器的组成部分
  3. Windows 软件推荐2020
  4. centos7 mysql安装教程_centos7环境下MySQL安装教程
  5. SDUT - Mountain Subsequences(dp)
  6. 【OOM】GC overhead limit exceeded
  7. js控制的动画,显示隐藏(元素,动画,显示隐藏)
  8. mysql中为啥只显示一条语句_MySQL 笔记整理(19) --为什么我只查一行的语句,也执行这么慢?...
  9. 零基础自学Java要多久,是不是很难?
  10. linux麒麟认证,【麒麟在线讲堂】优麒麟生物特征认证系统-03驱动开发
  11. Boxy SVG for Mac(矢量图编辑器)
  12. 关于 Android Studio 鼠标中键的一些技巧
  13. 网吧组建及相关技术(无盘技术;VLAN;PacketTrace)
  14. 2020年Apple的UWB技术产品资料整理
  15. 三极管 场效应管(MOS管) 引脚
  16. linux每个文件标识,Linux文件系统中每个文件用____来标识。
  17. 为什么那么多人想学(H客)?
  18. 使用Naive Bayes进行文本分类
  19. 如何在Windows中将应用程序添加到快速启动菜单
  20. 服务器系统可以使用软件吗,云服务器可以运行软件吗

热门文章

  1. 南瓜芽童装加盟让童装消费也疯狂
  2. 【云原生之K8s】 Kubernetes原理
  3. 20170326 ABAP调用外部webservice实例
  4. 干货分享 | Shader 实现 PPT 转场效果(附源码)
  5. AutoJs学习-关于各种头条阅读自动赚金币的思路-实践上
  6. mysql有哪几种搜索引擎_中国十大搜索引擎有哪些
  7. 利用Python轻松搞定数字英文验证码,搞定Python爬虫反爬
  8. Android判断网络连接是否可用,WiFi、移动数据是否打开等
  9. [练习]简易留言板制作
  10. GFS(GlusterFS)分布式文件系统