搜索
bottom↓
回复: 149

不要错过!SourceInsight 快速、精确导入 Linux Kernel 源码的方法

  [复制链接]

出0入0汤圆

发表于 2015-6-24 16:35:54 | 显示全部楼层 |阅读模式
本帖最后由 jujiaqi 于 2015-6-24 16:35 编辑

相信有很多人用 SourceInsight 查看 Linux Kernel 源码,但导入源码时会遇到一些问题。
1、如果把整个源码树都导入进去,查看符号定义的时候,会发现有大量重复定义,很难找到正确的位置
2、如果手动导入只和该硬件平台相关的源码,工作量太大
本帖提供了一个方法,可用脚本生成只和该硬件平台相关的源码的文件列表,然后通过该文件列表,将相应文件导入 SourceInsight 。
以下是步骤,共4步:
1、新建 SourceInsight 项目
     先不要导入文件,停在如下界面:
   

2、完整编译内核,将编译时输出的信息保存到一个文件中
    例如:
   
  1. make ARCH=arm > build_log.txt
复制代码

    build_log.txt 文件中内容大致如下:
   
  1. CC      init/main.o
  2.   CHK     include/generated/compile.h
  3.   CC      init/do_mounts.o
  4.   HOSTCC  usr/gen_init_cpio
  5.   CC      arch/arm/vfp/vfpmodule.o
  6.   CC      arch/arm/kernel/elf.o
  7.   AS      arch/arm/kernel/entry-armv.o
  8.   AS      arch/arm/vfp/entry.o
  9.   AS      arch/arm/kernel/entry-common.o
  10.   CC      arch/arm/kernel/irq.o
  11.   AS      arch/arm/vfp/vfphw.o
  12.   GEN     usr/initramfs_data.cpio
  13.   CC      arch/arm/kernel/opcodes.o
复制代码


3、生成文件列表
     下载 帖子 最后面的附件,解压后是 linux shell 脚本。
    编辑脚本两个变量,ARCH 和 MACH,MACH是平台的名字。如果你用的平台对应 arch/arm/mach-at91 的话,就改成 MACH=at91,以此类推。
   
    在内核源码目录下执行:
   
  1. ./sg.sh build_log.txt file_list.txt
复制代码

    这样,SourceInsight 需要的 文件列表 file_list.txt 就生成了。里面的内容大致如下:
     

4、导入文件列表
     回到 SourceInsight,点击窗口右下角 help 按钮上方的 “add from list” 按钮导入生成的 file_list.txt 文件。
     
     到此为止,文件导入完成了。重新打开工程,会提示同步、构建,之后就可以正常的查看源码了。

这样导入的文件和硬件平台是完全对应的。
下面是本帖的核心,就是这个脚本,有兴趣的可以看看:
   
  1. #!/bin/sh
  2. ARCH=arm
  3. MACH=at91
  4. FILE_IN=$1
  5. FILE_OUT=$2

  6. # .c
  7. SOURCE_LIST=""

  8. # generated file list
  9. FILE_LIST=""

  10. # nest depth for function get_includes()
  11. NEST_DTPTH=0

  12. # recursive function, used to get included files from files.
  13. # result is stored in FILE_LIST
  14. # $1 : file list, e.g. "fs/ext4/file.c fs/ext4/fsync.c"
  15. get_includes()
  16. {
  17.         local includes
  18.         local file

  19.         for file in $1
  20.         do
  21.                 if [ ! -e ${file} ]; then
  22.                         continue
  23.                 fi

  24.                 if echo "${FILE_LIST}" | grep -E ${file} > /dev/null; then
  25.                         continue
  26.                 fi
  27.                 FILE_LIST="${FILE_LIST} ${file}"

  28.                 NEST_DTPTH=$((NEST_DTPTH+1))
  29.                 echo "<${NEST_DTPTH} : ${file}"

  30.                 includes=$(                                                                                \
  31.                         grep -E -H '^#include' ${file} |                                \
  32.                         sed -r \
  33.                                 -e 's@^.*<(acpi/.*)>@include/\1@'                 \
  34.                                 -e 's@^.*<(asm-generic/.*)>@include/\1@'\
  35.                                 -e 's@^.*<(config/.*)>@include/\1@'         \
  36.                                 -e 's@^.*<(crypto/.*)>@include/\1@'         \
  37.                                 -e 's@^.*<(drm/.*)>@include/\1@'                 \
  38.                                 -e 's@^.*<(generated/.*)>@include/\1@'         \
  39.                                 -e 's@^.*<(keys/.*)>@include/\1@'                 \
  40.                                 -e 's@^.*<(linux/.*)>@include/\1@'                 \
  41.                                 -e 's@^.*<(math-emu/.*)>@include/\1@'         \
  42.                                 -e 's@^.*<(media/.*)>@include/\1@'                 \
  43.                                 -e 's@^.*<(misc/.*)>@include/\1@'                 \
  44.                                 -e 's@^.*<(mtd/.*)>@include/\1@'                 \
  45.                                 -e 's@^.*<(net/.*)>@include/\1@'                 \
  46.                                 -e 's@^.*<(pcmcia/.*)>@include/\1@'         \
  47.                                 -e 's@^.*<(rdma/.*)>@include/\1@'                 \
  48.                                 -e 's@^.*<(rxrpc/.*)>@include/\1@'                 \
  49.                                 -e 's@^.*<(scsi/.*)>@include/\1@'                 \
  50.                                 -e 's@^.*<(sound/.*)>@include/\1@'                 \
  51.                                 -e 's@^.*<(target/.*)>@include/\1@'         \
  52.                                 -e 's@^.*<(trace/.*)>@include/\1@'                 \
  53.                                 -e 's@^.*<(uapi/.*)>@include/\1@'                 \
  54.                                 -e 's@^.*<(video/.*)>@include/\1@'                 \
  55.                                 -e 's@^.*<(xen/.*)>@include/\1@'                 \
  56.                                 -e "s@^.*<(asm/.*)>@arch/${ARCH}/include/\1 arch/${ARCH}/include/generated/\1@"        \
  57.                                 -e "s@^.*<(mach/.*)>@arch/${ARCH}/mach-${MACH}/include/\1@"        \
  58.                                 -e 's@(^.*/)[^/]+\.c.*"(.*)"@\1\2@'         \
  59.                                 -e 's@/\*.*@@'                                                         \
  60.                                 -e 's@^.*\#include.*$@@'                                  \
  61.                                 -e 's@^@ @' |                                                        \
  62.                         sort |                                                                                 \
  63.                         uniq |                                                                                \
  64.                         tr -d '\n' |                                                                 \
  65.                         tr -d '\r'                                                                        \
  66.                 )

  67.                 if [ -n "${includes}" ]; then
  68.                         get_includes "${includes}"
  69.                 fi
  70.                 echo ">${NEST_DTPTH}) : ${file}"
  71.                 NEST_DTPTH=$((NEST_DTPTH-1))
  72.         done
  73. }

  74. # get *.c from kernel build log
  75. SOURCE_LIST=$(                                                \
  76.         grep -E '^\s*CC' ${FILE_IN} |        \
  77.         sed -r                                                         \
  78.                 -e 's/^\s*CC\s*/ /'                        \
  79.                 -e 's/\.o/\.c/'                        |        \
  80.         tr -d '\n' |                                         \
  81.         tr -d '\r'                                                \
  82. )
  83. echo ${SOURCE_LIST}
  84. get_includes "${SOURCE_LIST}"

  85. FILE_LIST=$(echo "${FILE_LIST}" | sed -r -e 's/\s/\r\n/g' )

  86. echo "${FILE_LIST}" > ${FILE_OUT}
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-6-24 16:38:18 | 显示全部楼层
沙发 学习学习

出0入84汤圆

发表于 2015-6-24 18:10:52 | 显示全部楼层
这个必须顶,以前学习内核的时候确实遇到这样的问题 只是不知道这么解决 呵,后来者可以收藏了

出0入0汤圆

发表于 2015-6-24 18:26:32 | 显示全部楼层
楼主好人啊,我平时都是一个文件夹一个文件夹添加的

出0入0汤圆

发表于 2015-6-24 18:29:20 来自手机 | 显示全部楼层
好方法,我下次试试

出0入0汤圆

发表于 2015-6-24 18:31:10 | 显示全部楼层
mark,以后留着看

出0入0汤圆

发表于 2015-6-24 18:45:51 | 显示全部楼层
很好的方法

出0入0汤圆

发表于 2015-6-24 19:01:16 | 显示全部楼层
赞!!!!!

出0入0汤圆

发表于 2015-6-24 19:27:34 | 显示全部楼层
这个方法不错

出0入0汤圆

发表于 2015-6-24 19:50:52 | 显示全部楼层
真心不错,真心感谢

出0入8汤圆

发表于 2015-6-24 20:11:42 | 显示全部楼层
太好了。。之前一直是全部加到工程里面看,太乱了。

出100入0汤圆

发表于 2015-6-24 21:32:16 | 显示全部楼层
学习了,明天试一试。

出0入0汤圆

发表于 2015-6-24 22:25:37 | 显示全部楼层
此方法甚好,我以前也是一个个文件夹添加的。

出0入0汤圆

发表于 2015-6-25 07:06:49 | 显示全部楼层
方法真不错,有空验证一下

出0入0汤圆

发表于 2015-6-25 08:05:55 来自手机 | 显示全部楼层
绝对赞…方法好。

出0入0汤圆

发表于 2015-6-25 08:14:33 | 显示全部楼层
楼主真用心啊, 学习啦!

出0入0汤圆

发表于 2015-6-25 08:39:11 | 显示全部楼层
赞,楼主太给力了!

出0入0汤圆

发表于 2015-6-25 08:41:28 | 显示全部楼层
本帖最后由 zlyny 于 2015-6-25 09:59 编辑

用这个方法 .h 文件能导入么
------
修改:可以导入,没看全sh脚本

出0入0汤圆

发表于 2015-6-25 08:46:17 | 显示全部楼层
快速、精确导入 Linux Kernel

出0入0汤圆

发表于 2015-6-25 08:51:24 | 显示全部楼层
这个好东西,每次导入Linux内核都是一大推无关的平台

出0入0汤圆

发表于 2015-6-25 09:01:25 | 显示全部楼层
找时间试一试

出0入0汤圆

发表于 2015-6-25 09:05:59 | 显示全部楼层
有心人,方法不错。

出0入0汤圆

发表于 2015-6-25 09:13:04 | 显示全部楼层
好方法,感谢楼主,收藏了!

出0入0汤圆

发表于 2015-6-25 09:17:34 | 显示全部楼层
有想法,做事方法值得学习

出0入0汤圆

发表于 2015-6-25 09:19:12 | 显示全部楼层
这个必须顶,楼主解决了很多人在阅读内核代码的问题。

出0入0汤圆

发表于 2015-6-25 09:32:35 | 显示全部楼层
楼主是不是可以考虑把 ARCH 和 MACH 这两个变量作为脚步的输入参数,这样就不用手动修改脚步内容了。
例如:sg.sh  arm at91 build_log.txt file_list.txt

出0入0汤圆

发表于 2015-6-25 09:37:37 | 显示全部楼层
必须必须顶啊!非常感谢!

出0入0汤圆

发表于 2015-6-25 10:01:50 | 显示全部楼层
赞一个,这样看linux内核就方便多了

出0入102汤圆

发表于 2015-6-25 10:12:06 | 显示全部楼层
好方法,准备学习Linux,感谢分享。

出0入0汤圆

发表于 2015-6-25 11:19:34 | 显示全部楼层
好办法,参考下

出0入4汤圆

发表于 2015-6-25 11:25:14 来自手机 | 显示全部楼层
谢谢学习了

出100入101汤圆

发表于 2015-6-25 11:46:38 | 显示全部楼层
有必要看linux源码么

出0入134汤圆

发表于 2015-6-25 12:05:06 | 显示全部楼层
脚本真心强大

出0入0汤圆

发表于 2015-6-25 12:41:51 | 显示全部楼层
强大,赞!

出0入0汤圆

发表于 2015-6-25 12:51:47 | 显示全部楼层
楼主厉害,非常感谢。

出0入0汤圆

发表于 2015-6-25 13:36:22 | 显示全部楼层
非常感谢

出0入0汤圆

发表于 2015-6-25 13:39:45 | 显示全部楼层
不错                              

出0入0汤圆

发表于 2015-6-25 13:40:05 | 显示全部楼层
学习,谢谢楼主

出0入0汤圆

发表于 2015-6-25 13:50:42 来自手机 | 显示全部楼层
学习      

出0入0汤圆

发表于 2015-6-25 14:51:43 | 显示全部楼层
学习了,实测 添加不完全,那些相关的 .S 汇编文件没有添加.

出0入0汤圆

 楼主| 发表于 2015-6-25 15:15:31 | 显示全部楼层
确实没有考虑到汇编,不过默认设置下,用 SI 阅读 ARM 汇编有难度啊,不知道有没有什么好方法

出0入0汤圆

发表于 2015-6-25 15:27:36 | 显示全部楼层
有时间试试

出0入0汤圆

发表于 2015-6-25 15:39:51 | 显示全部楼层
jujiaqi 发表于 2015-6-25 15:15
确实没有考虑到汇编,不过默认设置下,用 SI 阅读 ARM 汇编有难度啊,不知道有没有什么好方法 ...

建议楼主把acpi这些头文件的搜索,改成目录递归查询的方式,就能不仅linux代码,ucos,mbed,.... 都能用了

出0入0汤圆

发表于 2015-6-25 15:48:45 | 显示全部楼层
jujiaqi 发表于 2015-6-25 15:15
确实没有考虑到汇编,不过默认设置下,用 SI 阅读 ARM 汇编有难度啊,不知道有没有什么好方法 ...

大概看了下LZ的脚本,LZ你只解析了C语言的 CC 没有解析汇编的 AS ,能加上解析AS的么?

出0入0汤圆

发表于 2015-6-25 15:54:50 | 显示全部楼层
linux里的汇编就那么几个,比较好找的

出0入0汤圆

 楼主| 发表于 2015-6-25 16:40:48 | 显示全部楼层
bbstr 发表于 2015-6-25 15:39
建议楼主把acpi这些头文件的搜索,改成目录递归查询的方式,就能不仅linux代码,ucos,mbed,.... 都能用了 ...

acpi 这几行可不是搜索头文件,而是做替换,比如,将头文件包含指示“#include <linux/module.h>” 替换成 文件路径"include/linux/module"。
这个方法并不是将 include 下面所有的头文件都包含进来,而是从参与编译的C文件出发,递归搜索引用的头文件,避免包含无用的头文件。

出0入0汤圆

发表于 2015-6-25 16:49:09 | 显示全部楼层
了解了,那如果需要用到的头文件不是在linux/,而是在别的某个路径下的,是-e 's@^.*<(path_to_inc_dir/.*)>@include/\1@'         \                  
?

出0入0汤圆

 楼主| 发表于 2015-6-25 16:58:55 | 显示全部楼层
bbstr 发表于 2015-6-25 16:49
了解了,那如果需要用到的头文件不是在linux/,而是在别的某个路径下的,是-e 's@^.*@include/\1@'         \ ...

凡是引用 include 目录下头文件的地方,都要做替换,因为编译内核时, include 目录是被加入到系统搜索路径的,所以可以使用
    #include <linux/xxx.h>
    #include <sound/xxx.h>
    #include <video/xxx.h>
liniux sound video 都是 include 目录下的子目录。
所以说,这一句只适合处理包含 include 目录下头文件的情况

出0入0汤圆

 楼主| 发表于 2015-6-25 17:02:18 | 显示全部楼层
gaojieqq123 发表于 2015-6-25 15:48
大概看了下LZ的脚本,LZ你只解析了C语言的 CC 没有解析汇编的 AS ,能加上解析AS的么? ...
  1. # get *.c from kernel build log
  2. SOURCE_LIST=$(                                                \
  3.         grep -E '^\s*CC' ${FILE_IN} |        \
  4.         sed -r                                                         \
  5.                 -e 's/^\s*CC\s*/ /'                        \
  6.                 -e 's/\.o/\.c/'                        |        \
  7.         tr -d '\n' |                                         \
  8.         tr -d '\r'                                                \
  9. )
  10. ASSEMBLY_LIST=$(                                                \
  11.         grep -E '^\s*AS' ${FILE_IN} |        \
  12.         sed -r                                                         \
  13.                 -e 's/^\s*AS\s*/ /'                        \
  14.                 -e 's/\.o/\.S/'                        |        \
  15.         tr -d '\n' |                                         \
  16.         tr -d '\r'                                                \
  17. )
  18. SOURCE_LIST="${SOURCE_LIST}${ASSEMBLY_LIST}"
复制代码


要添加汇编,可以这样做。对比原来的脚本,就知道改哪里了。
因为不太了解汇编文件的一些包含规则,所以这样做是否准确还不能确定。

出0入0汤圆

 楼主| 发表于 2015-6-25 17:07:27 | 显示全部楼层
wangcjishu 发表于 2015-6-25 09:32
楼主是不是可以考虑把 ARCH 和 MACH 这两个变量作为脚步的输入参数,这样就不用手动修改脚步内容了。
例如 ...

好建议,就是找不到编辑帖子的入口了 。难道现在发布的帖子不让编辑了吗?

出0入0汤圆

发表于 2015-6-25 17:10:34 | 显示全部楼层
可以导  RT-Thread  么?

出0入0汤圆

发表于 2015-6-25 17:19:51 | 显示全部楼层
导u-boot,rt-thread,ucos,mbed,。。。。

出0入0汤圆

发表于 2015-6-25 17:32:54 | 显示全部楼层
jujiaqi 发表于 2015-6-25 17:07
好建议,就是找不到编辑帖子的入口了 。难道现在发布的帖子不让编辑了吗? ...

COOL !完美了 !汇编也加入了.

出0入0汤圆

发表于 2015-6-25 17:33:53 | 显示全部楼层
好方法,下次再用。

出0入0汤圆

 楼主| 发表于 2015-6-25 17:42:28 | 显示全部楼层
bbstr 发表于 2015-6-25 17:19
导u-boot,rt-thread,ucos,mbed,。。。。

需要大家自由发挥了,这个脚本提供了一个框架。
如果目标换成 uboot、rtt等,难点在于:
需要清楚其源码结构,才能处理一些像"#include <linux/xxx.h>"这样的路径不完全的头文件包含指令。

出0入0汤圆

发表于 2015-6-25 17:54:35 | 显示全部楼层
jujiaqi 发表于 2015-6-25 17:42
需要大家自由发挥了,这个脚本提供了一个框架。
如果目标换成 uboot、rtt等,难点在于:
需要清楚其源码 ...

  这个还是比较清楚的,就是你这个shell脚本一时不好懂

出0入0汤圆

发表于 2015-6-25 17:55:58 | 显示全部楼层
不知道这个思路行不行,将一个工程里的所有头文件做成一个链表,解析c时去链表里查,然后将路径摘出来作为list

出0入0汤圆

发表于 2015-6-25 19:22:48 | 显示全部楼层
这个真是不错

出0入0汤圆

发表于 2015-6-25 19:56:17 | 显示全部楼层
这个方法太神奇了。

出0入0汤圆

发表于 2015-6-25 20:15:44 | 显示全部楼层
一直使用这个

出0入0汤圆

发表于 2015-6-25 20:28:03 | 显示全部楼层
very good

出0入0汤圆

发表于 2015-6-25 20:31:33 | 显示全部楼层
这个办法好,顶起~~

出0入0汤圆

发表于 2015-6-25 21:08:45 | 显示全部楼层
奇怪了 为什么我执行脚本 输出的的东西都在屏幕上 而没有写进参数2的txt文件

出0入0汤圆

发表于 2015-6-25 21:20:28 | 显示全部楼层
jujiaqi 发表于 2015-6-25 17:07
好建议,就是找不到编辑帖子的入口了 。难道现在发布的帖子不让编辑了吗? ...

我看了一下我之前发的帖子也没找到编辑,楼主的脚本写的挺好,感觉递归能把挺复杂的问题给简化了。
此外问个问题sed 中's@^.*<(acpi/.*)>@include/\1@' 中\1是指被替换的那个参数(即^.*<(acpi/.*)>)是吧,这个是sed的内部变量吗?

出0入0汤圆

发表于 2015-6-25 21:21:25 | 显示全部楼层
MARK                           

出0入0汤圆

发表于 2015-6-26 06:07:24 来自手机 | 显示全部楼层
不一定用sed啊。cut命令也可以

出0入0汤圆

发表于 2015-6-26 06:52:45 | 显示全部楼层
先收藏,谢谢

出0入0汤圆

发表于 2015-6-26 07:26:53 | 显示全部楼层
这个脚本能否用于uboot?

出0入0汤圆

发表于 2015-6-26 07:28:20 | 显示全部楼层
太好了,谢谢分享!

出50入0汤圆

发表于 2015-6-26 10:01:28 | 显示全部楼层
谢谢楼主的经验分享。

出0入0汤圆

发表于 2015-6-26 10:06:00 | 显示全部楼层
kernel mark

出0入0汤圆

 楼主| 发表于 2015-6-26 12:51:18 | 显示全部楼层
lize91 发表于 2015-6-25 21:08
奇怪了 为什么我执行脚本 输出的的东西都在屏幕上 而没有写进参数2的txt文件 ...

屏幕上显示的是当前处理的文件。脚本运行结束后,才会创建文件,写入文件列表。

出0入0汤圆

发表于 2015-6-26 13:02:29 | 显示全部楼层
教程写得清晰明白,感谢lz,收藏了先。

出15入118汤圆

发表于 2015-6-26 16:05:25 来自手机 | 显示全部楼层
收藏,好东西

出0入0汤圆

发表于 2015-6-27 01:14:00 | 显示全部楼层
这个主意不错,值得赞一下。

出0入0汤圆

发表于 2015-6-27 05:54:30 来自手机 | 显示全部楼层
好东西,Mark

出0入0汤圆

发表于 2015-6-27 09:54:50 | 显示全部楼层
不得不顶,mark之

出0入0汤圆

发表于 2015-6-27 23:34:40 来自手机 | 显示全部楼层
必须顶起,省去很多时间啊。

出0入0汤圆

发表于 2015-7-3 10:20:29 | 显示全部楼层
是个好方法,学习了!!

出0入0汤圆

发表于 2015-7-3 10:53:02 | 显示全部楼层
niub的帖子 实践下

出0入0汤圆

发表于 2015-7-3 11:10:58 | 显示全部楼层
收藏了,非常感谢。
是不是对于bootload等类似的工程也可以这样导入?

出0入0汤圆

发表于 2015-7-3 14:28:50 | 显示全部楼层
想知道国外的linux开发人员一般是怎么搞的

出0入0汤圆

发表于 2015-7-3 16:21:19 | 显示全部楼层
Mark,Source Insight 通过编译文件列表导入Linux代码。谢谢lz分享!

出0入0汤圆

发表于 2015-7-3 16:23:10 | 显示全部楼层
好帖呀~~~~~~~~~~~~~~

出0入0汤圆

发表于 2015-7-7 10:29:15 | 显示全部楼层
本帖最后由 QQ373466062 于 2015-7-7 10:32 编辑

我也写了一个类似的脚本,不过应该比楼主的这个包含的更全。欢迎拍砖。 一起改进。
http://www.amobbs.com/thread-5626800-1-1.html

出0入0汤圆

 楼主| 发表于 2015-7-10 16:33:34 | 显示全部楼层
QQ373466062 发表于 2015-7-7 10:29
我也写了一个类似的脚本,不过应该比楼主的这个包含的更全。欢迎拍砖。 一起改进。
http://www.amobbs.com/ ...

你那个做的挺全面的,而且脚本写得真漂亮

出0入0汤圆

发表于 2015-10-13 14:55:47 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2015-10-13 16:01:15 | 显示全部楼层
赞一下,现在天天用这玩意

出10入0汤圆

发表于 2015-10-13 19:44:07 | 显示全部楼层
赞一个,感谢楼主分享

出0入0汤圆

发表于 2015-10-20 10:47:05 | 显示全部楼层
Mark,SourceInsight添加linux内核源代码,谢谢lz分享。

出0入10汤圆

发表于 2015-10-20 10:59:01 | 显示全部楼层
好东西,值得看下!!

出0入0汤圆

发表于 2015-10-21 14:14:04 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2015-10-21 14:44:13 | 显示全部楼层
好东西,以前看的老师加入些垃圾文件,

出0入0汤圆

发表于 2015-10-21 16:48:05 | 显示全部楼层
好久不用mark!

出0入0汤圆

发表于 2015-10-21 19:14:17 | 显示全部楼层
收藏,正在学呢~~~

出0入0汤圆

发表于 2015-12-11 00:50:33 来自手机 | 显示全部楼层
回头试试

出0入0汤圆

发表于 2015-12-11 09:04:33 | 显示全部楼层
高手,去试试。

出0入0汤圆

发表于 2015-12-11 11:45:52 | 显示全部楼层
挺好的,谢了

出0入0汤圆

发表于 2015-12-11 13:00:00 | 显示全部楼层
好东东

出0入0汤圆

发表于 2015-12-11 13:06:52 | 显示全部楼层
感谢分享,导入确实方便
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 22:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表