当前位置:首页 » 编程软件 » freebsd如何交叉编译

freebsd如何交叉编译

发布时间: 2023-03-18 14:45:13

1. 当程序不能编译时怎么办调试configure

但是,这样行不通时怎么办?在本文中,Peter Seebash 讲述了当自动的配置脚本失效时应该如何去做——以及作为开发者您应如何尽量避免这种错误。毕竟,如果您的程序无法编译,其结果将和您的程序编译后不能运行一样,您的用户会减少。
现在许多开放源代码的程序都会附带有 configure 脚本。这种脚本的用途之一是自动进行对目标新系统的猜测过程。在过去,程序会附带一个 Makefile 文件,这个文件中有 6 个不同的编译标记和选项,但只会用到一个,其余全部注释掉,并且会有一个注解,告诉您“为您的系统选择合适的标记”。如果配置选项更复杂,可能还会有一个名为 config.h 的长长的 C 头文件,其中包含一些要设置的标记,这依赖于主机系统变量。
第一个方法很简单,在代码中使用 #ifdef 以支持两种系统,例如 BSD 和 System V。由于 Unix 的类型的增加,更为实用的方法是对每一个特性使用 #ifdef。每个系统的代码如下:清单 1. 每个系统的代码#ifdef SUNOS4 || NEXT || NETBSD || FREEBSD || OPENBSD
#include <string.h
#else#include <strings.h
#endif每个特性的代码如下:清单 2. 每个特性的代码#ifdef HAS_STRING_H
#include <string.h
#else#include <strings.h
#endif后者更容易适应新系统,但需要开发者进行大量的工作。由于现在有太多可能的目标系统,因此,第二种方法对用户来说帮助很大,不仅仅是可以自动生成配置头文件。完成这项任务的一种方法是使用 GNU autoconf 代码来生成 configure 脚本。这个脚本会去执行必要的测试,并创建一个具有适当值的配置头文件。
这种脚本的另一个功能是以一致的方式设置预定义的变量。用手工编辑标记一直存在一个问题,即修改了 Makefile 文件(比如将其安装到 /usr/gnu 而不是 /usr/local 目录下)却忘记修改头文件中相应的值。当然,这样的结果是,编译后的程序不知道到哪里去寻找它们自己的数据文件。使用 configure 脚本的一个好处是可以自动完成一致的安装(如果维护者做得没错的话)。
开发人员请注意,一个好的 configure 脚本的另一个好处在于,它会允许用户指定一些个人偏好,例如使用 /usr/gnu 而不是 /usr/local。
这些如何成为可能?编译,再编译configure 的许多功能实现机制其实很简单。为了能切身体会,您可以设计一个小测试程序,这个程序当且仅当期望的条件得到满足时才可以编译。将它保存在一个临时文件中,然后尝试编译它。例如,假定您想知道 X Windowing System 是否安装在 /usr/X11R6 目录下。一种方法是做一个如下的测试程序:#include <X11/X.h
int main(void) { return 0; }现在,如果您用编译器来尝试进行编译,那么只有当 <X11/X.h 在编译器的 include 路径中时,编译才会成功。因此,对每一个您认为 X 可能安装到的目录,可以将对应的 (directory)/include 加入到编译器的 include 路径中,并尝试对程序进行编译。如果采用某个值时示例文件可以编译,那么您就得到了正确的 include 路径。
请注意在 autoconf 中已经预定义了各种测试程序。如果可能,就直接使用这些测试程序,而不用自己去写。这样有很多好处。首先,autoconf 的新版本会改进这些测试程序,修正它们的错误,否则您将不得不自己去做这些工作。其次,这样会节省您的时间。当然,更好的方法是完全避免测试。如果您确认某一个测试是没有必要的(例如,即使机器字节多于 8 位也仍需要使 sizeof(char) 为 1),您可以完全不去进行这个测试。
有一些测试是功能测试;它不足以确定是否存在一个名为 memcmp() 的函数,它的语义必须正确。通常,这些测试用于只是在一两个平台上被注意到的非常不明显的错误。这些测试实际上会去运行测试程序,并检查它的输出。测试程序遵循标准的 Unix 习惯:如果测试通过则返回值为 0,如果失败则返回一个非 0 值。
一旦您有了足够的测试程序,您可以用它们来自动确定必需的编译标记和定义,以将它们放到头文件的某个地方。通常,configure 脚本会允许用户给出部分或全部已知的条件,而不是让脚本自己去猜测。
来看一个特例,假定,系统的 brokenmemmove() 出现了问题。如果您不知道它现在有一个只会影响少部分程序的 bug,您可能会编译一个程序并将其发布为产品,而没有意识到这样您将会遇到偶然的灾难性错误。
在许多情况下,一个冗长而复杂的 configure 脚本的最终结果是这样的:目标系统提供了这个程序用到的每一个标准特性,而且它们正确工作。在这种情况下为什么不手工去设置这些标记呢?这对开发者来说是可行的,而对众多用户来说就不可以了。用户可能不会知道到他们的 linux 版本存在特定的 bug。他们可能不知道已经安装了哪些软件包,或者安装到了何处。脚本帮那些最需要帮助的人来完成大部分的例行公事的工作。当脚本出错时,引发的额外工作的代价可能不会太大。
错在何处?既然您已经基本上了解了 configure 都做了些什么工作,您可以开始寻找错误了。有两种可能的 configure 错误。一种是 configure 是正确的,而您的系统缺少必要的先决条件。绝大多数情况下,configure 脚本会正确诊断出这种错误。更为麻烦的情况是 configure 本身的错误。这样的结果或者是不能生成配置,或者生成一个不正确的配置。
当 configure 的猜测无误,而您缺少先决条件时,您所要做就是要满足缺少的那些先决条件。当您找到并安装好后,再重新运行那个报告缺少先决条件的 configure 脚本,就可以成功了。(不要忘记删除 config.cache 文件,这个文件缓存了上一次测试的结果;您应该让 configure 从头开始。)如果您正在开发 configure 脚本,您需要确保您给出的错误消息有意义。如果您测试的是一个函数,而这个函数是一个常见的可添加的软件包的一部分,那么不要告诉用户缺少的函数的名称 —— 告诉用户他们需要的软件包。确保将先决条件信息写入 README 文件中。并且,请一定要告诉人们您测试使用的其他软件包的版本号。
阅读文档无论何时,当 configure 失败时您首先要做的是运行 configure -h,并检查参数列表。如果它找不到您确认已经安装的库,您可能可以指定到另一个位置来找到这个库。您还可以禁用和启用某些特性。例如,用于 Angband (一个 Roguelike 游戏)的 configure 脚本有一个可选的标记 —— enable-gtk,以告诉脚本在编译时启用 GTK 支持。如果没有这个标记,编译时根本不会去尝试。
如果您的系统配置得比较奇怪,您可能不得不为 configure 脚本设置一些非常详细的变量,而且如果是在交叉编译,您很可能得做一些非常特别的事情。CC 是 configure 用于指定 C 编译器的变量,通过指定 CC 的值可以解决许多问题。如果您指定了编译器,configure 将使用那个编译器而不用去猜测需要使用哪一个。要注意的是,这样您可以在命令行中指定选项和标记。例如,如果您希望编译时支持调试符号,尝试:CC="gcc -g -O1" ./configure(这里假定您使用的是 sh 系列的 shell;在 csh 中,用 setenv 来设置环境变量 CC。)阅读 config.log当 configure 脚本运行时,它会创建一个名为 config.log 的文件,其中记录的是测试日志和得到的结果。例如,一个典型的 config.log 片断如下:清单 3. config.log 的典型内容configure:2826: checking for getpwnam in -lsun
configure:2853: gcc -o conftest -g -O2 -fno-strength-rece conftest.c -lsun &5
ld: cannot find -lsun
configure:2856: $? = 1
configure: failed program was:
(a listing of the test program follows)如果我的系统中,-lsun 应该提供 getpwnam(),我应该可以使用命令行来对其进行确切检查,然后再使用测试程序。只需进行少量这样的调试,我就可以根据得到的信息来修改 configure 脚本。请注意有帮助的行号;这个测试从 configure 脚本的第 2,826 行开始。(如果您是一个 shell 程序员,您可能会喜欢在阅读 configure 脚本片断时打印出行号;在 shell 中 $LINENO 不能自动地被扩展为合理值,脚本使用 sed 创建一个包含有行号的自身拷贝!)当一个测试失败或者得到意外的结果时,最好先去读一读日志文件。请注意,有时测试失败仅仅是因为上一个测试的失败,这种失败实际上并不重要。例如,configure 可能会因为找不到一个您闻所未闻的库而退出,而这可能是因为测试标准 C 库中某个功能的程序失败而导致无法找到那个库。在这种情况下,只需要解决第一个问题,第二个问题也就不会再出现了。
一种情况是测试程序设计不正确而可能

2. LINUX交叉编译工具链和GCC是什么关系啊

编译工具链一般最简化的为
binutils
+
gcc
+
glibc
+
kernel-header
组合的环境。
GCC
就是编译器,他的输出每次安装只能有针对一个架构的指令输出。如果要多个架构输出,那就要装多个
GCC
,所以编译工具链里面会有一个
GCC

交叉编译就是跨架构编译,编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。
工具链光有
GCC
是不行的,还需要一个
binutils
的二进制连接器,以及一个最基本的目标架构的
C
库,C
库还需要一个目标架构的内核源代码才能完全工作(当然不是必须的,但编译有的时候需要)
又因为
GCC
、binutils
不能实现单软件同时多架构输出,所以需要单独另装,又加上
C
库和内核头文件需要目标架构的东西而不能用本机本地架构的数据。
所以一个交叉编译工具链就是针对目标架构准备的单独安装单独使用的
binutils
+
gcc
+
glibc
+
kernel-header
的集合了。
PS:这个
kernel-header
并不一定就是
Linux
,他还可以是别的系统核心开发库,比如
FreeBSD

3. 什么是嵌入式设计中的交叉编译

Compiling a program takes place by running a compiler on the build platform. The compiled program will run on the host platform. Usually these two are the same; if they are different, the process is called cross-compilation.
对一个程序进行编译的过程要通过在一个操作系统平台(编译平台)上运行编译器而完成。被编译的程序也将运行在一个操作系统平台(运行平台)上,这二个平台通常是相同的,如果二者不同,则这个编译过程被称为交叉编译。

Typically the hardware architecture differs, like for example when compiling a program destined for the MIPS architecture on an x86 computer; but cross-compilation is also applicable when only the operating system environment differs, as when compiling a FreeBSD program under Linux; or even just the system library, as when compiling programs with uClibc on a glibc host.
一般来说交叉编译被应用在硬件结构不同的机器上,如在x86的计算机上为MIPS体系的机器编译程序。但交叉编译也适用于硬件结构相同而操作系统不同的情况,比如在Linux操作系统下为FreeBSD编译程序。交叉编译甚至也可以应用于只有系统库不同的情况下,如在使用glibc的机器上用uClibc编译程序。

Cross-compilation is typically more involved and prone to errors than with native compilation. Due to this, cross-compiling is normally only utilized if the target is not yet self-hosting (i.e. able to compile programs on its own), unstable, or the build system is simply much faster. For many embedded systems, cross-compilation is simply the only possible way to build programs, as the target hardware does not have the resources or capabilities.
交叉编译通常比本地编译更容易引发错误。因此,交叉编译一般只用于目标平台不能自洽(比如说,目标平台无法完成程序编译),不稳定或者编译平台速度更快的情况下。对大多数嵌入式系统来说,由于目标平台的执行能力或系统资源有限,交叉编译是唯一可行的编译方式。

4. 如何在freebsd下交叉编译arm-linux

1. 下载源文件、补丁和建立编译的目录 2. 建立内核头文件 3. 建立二进制工具(binutils) 4. 建立初始编译器(bootstrap gcc) 5. 建立c库(glibc) 6. 建立全套编译器(full gcc)

5. 求FreeBSD的教程

FreeBSD连载(94):基于NAT的负载均衡技术 (王波 2月3日 17:06)
FreeBSD连载(93):反向代理负载均衡 (王波 2月3日 02:26)
FreeBSD连载(92):基于DNS的负载均衡 (王波 2月2日 01:04)
FreeBSD连载(91):提升静态网页服务能力的综合方式 (王波 2月1日 13:24)
FreeBSD连载(90):单服务器性能调整 (王波 1月31日 13:22)
FreeBSD连载(89):CGI和SSI的安全性 (王波 1月30日 16:17)
FreeBSD连载(88):安全连接方式SSL (王波 1月29日 00:38)
FreeBSD连载(87):基于用户的访问控制 (王波 1月28日 17:07)
FreeBSD连载(86):对IP地址和域名的控制 (王波 1月27日 14:59)
FreeBSD连载(85):配置Apache服务器(2) (王波 1月26日 15:03)
FreeBSD连载(84):配置Apache服务器(1) (王波 1月25日 13:29)
FreeBSD连载(83):Apache基本安装 (王波 1月24日 14:29)
FreeBSD连载(82):数据处理方式 (王波 1月23日 01:55)
FreeBSD连载(81):超文本传输协议HTTP (王波 1月22日 18:15)
FreeBSD连载(80):构建防火墙 (王波 1月21日 13:06)
FreeBSD连载(79):设置和使用ipfilter (王波 1月20日 15:30)
FreeBSD连载(78):设置和使用ipfw/natd (王波 1月19日 18:03)
FreeBSD连载(77):安全工具 (王波 1月18日 13:28)
FreeBSD连载(76):设置基本系统 (王波 1月17日 13:00)
FreeBSD连载(75):防火墙技术 (王波 1月16日 15:26)
FreeBSD连载(74):安全问题 (王波 1月15日 14:21)
FreeBSD连载(73):认证与加密 (王波 1月14日 13:25)
FreeBSD连载(72):设置和使用DHCP (王波 1月13日 15:16)
FreeBSD连载(71):DHCP的工作过程 (王波 1月12日 14:45)
FreeBSD连载(70):用SharityLight装SMB文件系统 (王波 1月11日 17:03)
FreeBSD连载(69):使用smbclient访问Windows资源 (王波 1月10日 14:29)
FreeBSD连载(68):根据Windows网络设置Samba (王波 1月9日 18:26)
FreeBSD连载(67):配置samba (王波 1月8日 17:02)
FreeBSD连载(66):安装samba (王波 1月7日 13:42)
FreeBSD连载(65):SMB/CIFS协议 (王波 1月6日 13:05)
FreeBSD连载(64):NetBIOS名字解析 (王波 1月6日 11:41)
FreeBSD连载(63):集成Unix和Windows的方式 (王波 1月4日 19:35)
FreeBSD连载(62):升级系统 (王波 1月3日 13:55)
FreeBSD连载(61):其他内核设置选项 (王波 1月3日 13:39)
FreeBSD连载(60):缺省内核配置选项 (王波 1月3日 11:23)
FreeBSD连载(59):编译安装新内核 (王波 12月31日 16:36)
FreeBSD连载(58):为编译内核准备源代码 (王波 12月30日 15:44)
FreeBSD连载(57):可执行程序格式 (王波 12月29日 15:01)
FreeBSD连载(56):手工编译安装程序 (王波 12月28日 11:11)
FreeBSD连载(55):Ports Collection (王波 12月27日 16:23)
FreeBSD连载(54):配置文件XF86Config (王波 12月26日 16:09)
FreeBSD连载(53):中文X服务器 (王波 12月25日 12:50)
FreeBSD连载(52):外挂式中文显示与输入软件 (王波 12月24日 15:52)
FreeBSD连载(51):中文X应用软件 (王波 12月23日 13:49)
FreeBSD连载(50):定制X Window的基本方法 (王波 12月22日 13:45)
FreeBSD连载(49):进入X Window (王波 12月21日 16:20)
FreeBSD连载(48):X Window的基本概念 (王波 12月21日 15:56)
FreeBSD连载(47):使用xf86config配置X服务器 (王波 12月19日 17:59)
FreeBSD连载(46):使用XF86Setup配置X服务器 (王波 12月19日 17:46)
FreeBSD连载(45):安装XFree86 (王波 12月17日 18:23)
FreeBSD连载(44):X Free86的硬件要求 (王波 12月16日 13:34)
FreeBSD连载(43):NFS服务器 (王波 12月15日 18:57)
FreeBSD连载(42):NFS客户支持 (王波 12月14日 14:09)
FreeBSD连载(41):在FreeBSD上查看邮件 (王波 12月14日 13:50)
FreeBSD连载(40):邮件服务器 (王波 12月12日 18:59)
FreeBSD连载(39):定义自己的名字服务 (王波 12月11日 15:02)
FreeBSD连载(38):配置缓冲或转发方式的named (王波 12月10日 11:40)
FreeBSD连载(37):DNS的体系结构 (王波 12月9日 14:20)
FreeBSD连载(36):PPP协议 (王波 12月8日 13:09)
FreeBSD连载(35):串口和modem (王波 12月7日 11:30)
FreeBSD连载(34):手工配置网络 (王波 12月6日 11:44)
FreeBSD连载(33):DOD参考模型 (王波 12月5日 18:11)
FreeBSD连载(32):系统备份 (王波 12月5日 17:50)
FreeBSD连载(31):系统日志 (王波 12月3日 17:11)
FreeBSD连载(30):配置打印机 (王波 12月2日 23:09)
FreeBSD连载(29):打印机配置:系统结构 (王波 12月2日 00:52)
FreeBSD连载(28):Packages Collection (王波 11月30日 17:05)
FreeBSD连载(27):应用软件的类别 (王波 11月29日 12:23)
FreeBSD连载(26):进程的权限 (王波 11月28日 18:31)
FreeBSD连载(25):定时执行程序 (王波 11月28日 18:17)
FreeBSD连载(24):查看系统状态 (王波 11月26日 16:10)
FreeBSD连载(23):配置系统时间 (王波 11月25日 12:44)
FreeBSD连载(22):调整控制台设置 (王波 11月24日 17:43)
FreeBSD连载(21):管理交换设备 (王波 11月23日 13:03)
FreeBSD连载(20):建立文件系统 (王波 11月22日 15:30)
FreeBSD连载(19):检查硬盘调整文件系统的目录结构 (王波 11月21日 18:29)
FreeBSD连载(18):软盘操作 (王波 11月21日 17:24)
FreeBSD连载(17):安装文件系统 (王波 11月19日 16:00)
FreeBSD连载(16):设备文件 (王波 11月18日 16:37)
FreeBSD连载(15):文件的属性 (王波 11月17日 19:49)
FreeBSD连载(14):shell设置 (王波 11月16日 15:04)
FreeBSD连载(13):超级用户root、登录类别 (王波 11月15日 19:16)
FreeBSD连载(12):用户管理-增加用户 (王波 11月14日 17:20)
FreeBSD连载(11):系统登录与退出 (王波 11月13日 04:20)
FreeBSD连载(10):系统启动脚本 (王波 11月12日 13:20)
FreeBSD连载(09):系统启动过程 (王波 11月11日 16:03)
FreeBSD连载(08):其他安装问题 (王波 11月10日 20:57)
FreeBSD连载(07):基本系统配置 (王波 11月9日 18:11)
FreeBSD连载(06):安装FreeBSD ( 11月8日 16:29)
FreeBSD连载(05):安装之前的准备 (王波 11月7日 18:20)
FreeBSD连载(04):FreeBSD的相关资源 (王波 11月6日 02:09)
FreeBSD连载(03):其他相关系统和组织 (王波 11月5日 14:46)
FreeBSD连载(02):FreeBSD的功能特点 (王波 11月4日 18:28)
FreeBSD连载(01):FreeBSD的起源 (王波 11月3日 17:19)
FreeBSD连载:FreeBSD使用大全目录 (王波 11月3日 03:58)
FreeBSD连载:作者自序 (王波 11月3日 03:14)

http://tech.sina.com.cn/focus/FreeBSD/index.shtml

6. 如何在android上支持jna <二>实战步骤

1) 首先 JNA存在形式只是一个jna.jar 结构为java class + platform native
lib(libjnidispatch.so),现在支持的平台有win32 x86/amd64/mac, linux x86/bsd, sun os
等等,java层应该是通用,无需做改动。所以文章就做在怎样得到android平台辨认的native .so 上。

2) 确定思路,搭建jna/native arm交叉编译环境,得到android自己的jna.jar.

3) 源码下载,开源项目非常方便

$ svn co https //jna dev java net/svn/jna/trunk/jnalib

4) 选择编译器,考虑到jna是gnu项目,而且所有eabi编译器都兼容,所以选择arm-linux-none-gnueabi-gcc.

5) 进入源码树,

$ cd jnalib

6) 设置环境变量。java, gcc, ant等。

$ export
PATH=/opt/ant/bin:/opt/jdk1.6.0_11/bin:/opt/arm-none-linux-gnueabi/bin:/opt/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin:$PATH

$ export JAVA_HOME=/usr/java/jdk1.6.0_21/

7) 更改build.xml,native/makefile来支持arm平台。(比较长,可略过不看)

ndex:
native/Makefile
===================================================================
---
native/Makefile (revision 1146)
+++ native/Makefile (working
)
@@ -54,8 +54,8
@@
LIBSFX=.so
ARSFX=.a
JNISFX=$(LIBSFX)
-CC=gcc
-LD=gcc
+CC=arm-none-linux-gnueabi-gcc
+LD=arm-none-linux-gnueabi-gcc
LIBS=
#
Default to Sun recommendations for JNI compilation
COPT=-O2
-fno-omit-frame-pointer -fno-strict-aliasing
@@ -126,10 +126,12
@@
endif

ifeq ($(OS),linux)
-ARCH=$(shell uname -m | sed
's/i.86/i386/g')
+ARCH=arm #$(shell uname -m | sed
's/i.86/i386/g')
PCFLAGS+=-fPIC
CDEFINES+=-DHAVE_PROTECTION
LDFLAGS+=-Wl,-soname,$@
+FFI_CONFIG
+=
--host=arm-none-linux-gnueabi
+CINCLUDES+=-I/usr/include
endif

ifeq
($(OS),freebsd)
Index:
build.xml
===================================================================
---
build.xml (revision 1146)
+++ build.xml (working )
@@ -92,6
+92,7 @@
<os arch="ppc64"/>
<os
arch="sparcv9"/>
<os arch="amd64"/>
+ <os
arch="arm"/>
</or>
</condition>

<condition property="ld.preload" value="LD_PRELOAD_64"
else="LD_PRELOAD">
@@ -110,6 +111,9 @@
<condition
property="jre.arch" value="i386">
<equals arg1="x86"
arg2="${os.arch}"/>
</condition>
+ <condition
property="jre.arch" value="arm">
+ <equals arg1="arm"
arg2="${os.arch}"/>
+ </condition>
<condition
property="jre.arch" value="amd64">
<equals arg1="x86_64"
arg2="${os.arch}"/>
</condition>
@@ -285,6 +289,7 @@

< file="${dist}/out-of-date.jar" tofile="${dist}/win32-x86.jar"
overwrite="true"/>
< file="${dist}/out-of-date.jar"
tofile="${dist}/win32-amd64.jar" overwrite="true"/>
<
file="${dist}/out-of-date.jar" tofile="${dist}/linux-i386.jar"
overwrite="true"/>
+ < file="${dist}/out-of-date.jar"
tofile="${dist}/android.jar" overwrite="true"/>
<
file="${dist}/out-of-date.jar" tofile="${dist}/linux-amd64.jar"
overwrite="true"/>
< file="${dist}/out-of-date.jar"
tofile="${dist}/linux-ia64.jar" overwrite="true"/>
<
file="${dist}/out-of-date.jar" tofile="${dist}/freebsd-i386.jar"
overwrite="true"/>
@@ -598,6 +603,9 @@
<zipfileset
src="${dist}/linux-i386.jar"

includes="*jnidispatch*"

prefix="com/sun/jna/linux-i386"/>
+ <zipfileset
src="${dist}/arm-none-linux.jar"
+
includes="*jnidispatch*"
+
prefix="com/sun/jna/android"/>
<zipfileset
src="${dist}/linux-amd64.jar"

includes="*jnidispatch*"

prefix="com/sun/jna/linux-amd64"/>

8) 编译

$ ant -Djre.arch=arm -Dos.arch=arm -Dos.prefix=linux-arm

9)编译完成,你就可以在build下等到arm编译器编出来的jna.jar了, 如果你用eclipse,就可以直接Project...->add
Jar 使用它了。有可能(还不确定), android不支持在jar包中加本地native .so 的做法,你可以将jna.jar分拆开将java
class还以Jar的方式加载,而把linux-arm/下的libjnidispatch.so以add Lib..的方法加入,你可以尝试一下。
转载五品员外郎

热点内容
python文字 发布:2025-07-19 15:38:43 浏览:828
php办公系统 发布:2025-07-19 03:06:35 浏览:900
奥德赛买什么配置出去改装 发布:2025-07-19 02:53:18 浏览:42
请与网络管理员联系请求访问权限 发布:2025-07-19 02:37:34 浏览:189
ipad上b站缓存视频怎么下载 发布:2025-07-19 02:32:17 浏览:844
phpcgi与phpfpm 发布:2025-07-19 02:05:19 浏览:527
捷达方向机安全登录密码是多少 发布:2025-07-19 00:57:37 浏览:694
夜魔迅雷下载ftp 发布:2025-07-19 00:39:29 浏览:99
增值税票安全接入服务器地址 发布:2025-07-19 00:20:45 浏览:486
solidworkspcb服务器地址 发布:2025-07-18 22:50:35 浏览:823