闲碎记事本 闲碎记事本
首页
  • JAVA
  • Cloudflare
  • 学完再改一遍UI
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YAN

我要偷偷记录...
首页
  • JAVA
  • Cloudflare
  • 学完再改一遍UI
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • python

  • vue

  • H5

  • C

    • C语言环境搭建
      • C语言
      • C++
    • 学习
    • C
    YAN
    2025-03-06
    目录

    C语言环境搭建

    # 环境搭建

    下载 msys2-x86_64-20250221.exe (opens new window)

    MSYS2 主要提供了 3 种 MinGW-w64 工具链,分别是:

    • mingw-w64-x86_64-gcc

      • 相对 MSYS2 路径 mingw64
      • 这是一个用于 64 位 Windows 的 GCC 工具链,使用 MinGW-w64 项目提供的标准 Windows API。这意味着它生成的可执行文件可以在标准的 64 位 Windows 环境中运行。
    • mingw-w64-i686-gcc

      • 相对 MSYS2 路径 mingw32
      • 这是一个用于 32 位 Windows 的 GCC 工具链,也使用 MinGW-w64 项目提供的标准 Windows API。这意味着它生成的可执行文件可以在标准的 32 位 Windows 环境中运行。
    • mingw-w64-ucrt-x86_64-gcc

      • 相对 MSYS2 路径 ucrt64
      • 这是一个用于 64 位 Windows 的 GCC 工具链,但与标准工具链不同,它使用 UCRT(Universal C Runtime)。UCRT 是微软提供的新一代 C 运行时库,相比传统的 MSVCRT,UCRT 提供了更好的兼容性和性能。

    安装GCC

    pacman -S mingw-w64-ucrt-x86_64-gcc
    

    安装GDB

    pacman -S mingw-w64-ucrt-x86_64-gdb 
    

    安装make组件

    pacman -S mingw-w64-x86_64-make
    pacman -S mingw-w64-x86_64-cmake
    

    配置环境变量 根据不同的工具链制定不同的bin路径,以 ucrt 举例:

    ${msys64}\ucrt64\bin
    

    ${msys64} 为MSYS2 安装路径

    查看gcc版本

    gcc --version
    

    # 附 pacman 指令

    选项 描述
    -S 安装软件包
    -Syu 同步软件包数据库并升级系统
    -R 删除软件包
    -Qs 查询已安装的软件包
    -Si 显示软件包的详细信息
    -Sc 清理未安装软件包的缓存
    -Scc 清理所有软件包的缓存

    # VS CODE 环境搭建

    搜索栏 > >C/C++编译配置 >生成c_cpp_properties.json

    内容如下

    {
        "configurations": [
            {
                "name": "C",
                "includePath": [
                    "${workspaceFolder}/**"
                ],
                "defines": [
                    "_DEBUG",
                    "UNICODE",
                    "_UNICODE"
                ],
                "mergeConfigurations": false,
                "browse": {
                    "path": [
                        "d:/Users/yf/cprojects/test/**",
                        "d:/Users/yf/cprojects/test"
                    ],
                    "limitSymbolsToIncludedHeaders": true
                },
                "compilerPath": "D:\\tools\\msys64\\ucrt64\\bin\\gcc.exe",
                "compilerPathInCppPropertiesJson": "D:\\tools\\msys64\\ucrt64\\bin\\gcc.exe",
                "intelliSenseMode": "gcc-x64",
                "cStandard": "c17",
                "cppStandard": "c++17"
            },
            {
                "name": "C++",
                "includePath": [
                    "${workspaceFolder}/**"
                ],
                "defines": [
                    "_DEBUG",
                    "UNICODE",
                    "_UNICODE"
                ],
                "mergeConfigurations": false,
                "browse": {
                    "path": [
                        "d:/Users/yf/cprojects/test/**",
                        "d:/Users/yf/cprojects/test"
                    ],
                    "limitSymbolsToIncludedHeaders": true
                },
                "compilerPath": "D:\\tools\\msys64\\ucrt64\\bin\\g++.exe",
                "compilerPathInCppPropertiesJson": "D:\\tools\\msys64\\ucrt64\\bin\\g++.exe",
                "intelliSenseMode": "gcc-x64",
                "cStandard": "c17",
                "cppStandard": "c++17"
            }
        ],
        "version": 4
    }
    

    终端 > 配置任务 > 生成tasKs.json文件

    内容如下

    {
    	"version": "2.0.0",
    	"tasks": [
    		{
    			"type": "Cbuild",
    			"label": "gcc.exe生成活动文件",
    			"command": "D:\\tools\\msys64\\ucrt64\\bin\\gcc.exe",
    			"args": [
    				"-fdiagnostics-color=always",
    				"-g",
    				"${workspaceFolder}\\const.c",
    				"${workspaceFolder}\\test.c",
    				"${workspaceFolder}\\my_header.c",
    				"${workspaceFolder}\\include1.c",
    				"${workspaceFolder}\\include2.c",
    				// "${file}",
    				//  -L. 明确指定当前目录(.)作为库文件的搜索路径。 用于链接当前目录下的库文件 等价于 -L./
    				//  -l magic 表示寻找 libmagic.a
    				// "-L.", "-lmagic",
    				//  如果工作路径不是当前目录需要指定绝对路径
    				// "-L.", "${workspaceFolder}\\magic.a",
    				"-L.", "magic.a",
    				"-o",
    				"${workspaceFolder}\\${workspaceRootFolderName}.exe"
    			],
    			"options": {
    				//指定工作路径
    				// "cwd": "D:\\tools\\msys64\\ucrt64\\bin"
    				"cwd": "${workspaceFolder}"
    			},
    			"problemMatcher": [
    				"$gcc"
    			],
    			"group": {
    				"kind": "build",
    				"isDefault": true
    			},
    			"detail": "编译器: D:\\tools\\msys64\\ucrt64\\bin\\gcc.exe"
    		},
    
            {
    			"type": "cppbuild",
    			"label": "g++.exe生成活动文件",
    			"command": "D:\\tools\\msys64\\ucrt64\\bin\\g++.exe",
    			"args": [
    				"-fdiagnostics-color=always",
    				"-g",
    				"${workspaceFolder}\\src\\main.cpp",
    				"-o",
    				"${workspaceFolder}\\bin\\${workspaceRootFolderName}.exe"
    			],
    			"options": {
    				"cwd": "${workspaceFolder}"
    			},
    			"problemMatcher": [
    				"$gcc"
    			],
    			"group": {
    				"kind": "build",
    				"isDefault": true
    			},
    			"detail": "编译器: D:\\tools\\msys64\\ucrt64\\bin\\g++.exe"
    		}
    
    		{
    			"label": "删除exe",
    			"type": "shell",
    			"command": "rm  ${workspaceFolder}\\*.exe",
    		},
    		{
    			"label": "打印信息",
    			"type": "shell",
    			"command": "echo '当前工作路径:${workspaceFolder}  工作空间名字:${workspaceRootFolderName}  当前文件路径:${file} => ${fileDirname}\\${fileBasenameNoExtension}'",
    		},
    	]
    }
    

    添加调试

    launch.json

    {
        // 使用 IntelliSense 了解相关属性。 
        // 悬停以查看现有属性的描述。
        // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(gdb) 启动",
                "type": "cppdbg",
                "request": "launch",
                "program": "${workspaceFolder}/bin/${workspaceRootFolderName}.exe",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${fileDirname}",
                "environment": [],
                "externalConsole": false,
                "MIMode": "gdb",
                "miDebuggerPath": "D:/tools/msys64/ucrt64/bin/gdb.exe",
                "setupCommands": [
                    {
                        "description": "为 gdb 启用整齐打印",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    },
                    {
                        "description": "将反汇编风格设置为 Intel",
                        "text": "-gdb-set disassembly-flavor intel",
                        "ignoreFailures": true
                    }
                ]
            }
    
        ]
    }
    

    # 关于库编译

    # 静态库

    # 编译 mylib.c 为目标文件
    # -c 选项告诉 gcc 只编译源文件,不进行链接。
    # mylib.o 是一个二进制文件,包含了 mylib.c 的机器代码,但还没有被打包成库。
    gcc -c mylib.c -o mylib.o
    
    # 生成静态库文件:
    #r 表示替换库中已存在的同名文件。
    #c 表示创建库,如果不存在则创建。
    #s 表示在库中创建索引,加快链接速度。
    ar rcs libmylib.a mylib.o
    
    # 编译主程序并链接静态库
    gcc main.c -L. -lmylib -o main
    

    # 动态库

    # 编译 mylib.c 为目标文件,
    # -c 选项告诉 gcc 只编译源文件,不进行链接。
    # -fPIC (Position Independent Code)选项生成位置无关代码,这是动态库的必需特性,因为它需要在内存中加载到任意地址。
    gcc -fPIC -c mylib.c -o mylib.o
    
    # 目标文件 mylib.o 打包成一个动态库文件 libmylib.so。
    # -shared 选项告诉 gcc 生成一个共享库(动态库)。
    #  是一个动态库文件,包含了 mylib.o 的代码,可以在运行时被加载到内存中。
    gcc -shared -o libmylib.so mylib.o
    
    # 编译主程序并链接动态库:
    #  -L. 选项告诉链接器在当前目录(.)中查找库文件。
    # -lmylib 选项告诉链接器使用名为 libmylib.so 的库(-l 后面跟的是库名称,去掉 lib 前缀和 .so 后缀)。
    gcc main.c -L. -lmylib -o main
    
    ### 设置动态库路径(Linux)
    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    
    # 以上命令在VS Code 配置
            {
                "label": "编译静态库",
                "type": "shell",
                "command": "D:\\tools\\msys64\\ucrt64\\bin\\gcc.exe",
                "args": ["-c", "magic.c", "-o", "magic.o"],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            },
            {
                "label": "创建静态库",
                "type": "shell",
                "command": "ar",
                "args": ["rcs", "magic.a", "magic.o"],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            },
            {
                "label": "连接静态库",
                "type": "shell",
                "command": "D:\\tools\\msys64\\ucrt64\\bin\\gcc.exe",
                "args": ["main.c", "-L.", "-lmylib", "-o", "main.exe"],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            },
            {
                "label": "编译动态库",
                "type": "shell",
                "command": "gcc",
                "args": ["-fPIC", "-c", "mylib.c", "-o", "mylib.o"],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            },
            {
                "label": "创建动态库",
                "type": "shell",
                "command": "gcc",
                "args": ["-shared", "-o", "libmylib.dll", "mylib.o"],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            },
            {
                "label": "连接动态库",
                "type": "shell",
                "command": "gcc",
                "args": ["main.c", "-L.", "-lmylib", "-o", "main.exe"],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            }
    
    上次更新: 2025/05/14, 01:34:05
    2D3D
    C语言

    ← 2D3D C语言→

    最近更新
    01
    Caddy操作指南
    04-25
    02
    Swap空间
    04-22
    03
    Alist使用
    04-21
    更多文章>
    Theme by Vdoing | Copyright © 2022-2025 YAN | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式