环境
ssh ,g++/gcc , gdb ,make vscode
远程连接服务器
安装Remote ssh
连接服务器
选第一个,感觉没啥关系
右下角Open Config
HostName 填ip 然后就像打开本地文件一样打开服务器里的文件
搭建c/c++ 环境
安装c/c++ 插件
搭建普通c/c++开发环境
经典hello,World
#include<stdio.h>
int main(){
printf("%s","Hello,World\n");
return 0;
}
选debug , gdb 和 gcc
调试成功
搭建linux内核开发环境
ctrl+shift+p打开命令面板。 生成了一个配置文件 c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${default}",
"/lib/modules/4.18.0-305.12.1.el8_4.x86_64/build/include",
"/lib/modules/4.18.0-305.12.1.el8_4.x86_64/build/arch/x86/include",
"/lib/modules/4.18.0-305.12.1.el8_4.x86_64/build/arch/x86/include/generated"
],
"defines": [
"__KERNEL__=1",
"MODULE=1",
"KBUILD_MODNAME=\"hello\""
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
版本换成uname -r 命令输出的。 这里解释一下。如过你下了源码包可以用/usr/src 目录下的。这里我就注释掉了。而且不同linux 发行版位置还不太一样。这里我用的是CentOS 。
还有一个defines 很重要。 如图,linux 内核的一些宏要定义了特殊的宏才可以被条件编译。否则vscode 会无法识别这些宏。
测试
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello World enter/n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Hello World exit/n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("lyf");
MODULE_DESCRIPTION("This is a simple example!/n");
MODULE_ALIAS("A simplest example");
Makefile 文件
CONFIG_MODULE_SIG=n
# 如果定义了KERNELRELEASE,那么我们已经从内核构建系统中被调用,并且可以使用它的语言。
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# 否则,我们直接从命令行调用;调用内核构建系统。
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif
insmod ./hello.ko
rmmod hello
lsmod
dmesg | tail
|