{"id":329853,"date":"2023-03-07T04:46:58","date_gmt":"2023-03-07T03:46:58","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=clion&#038;p=329853"},"modified":"2023-03-07T04:47:11","modified_gmt":"2023-03-07T03:47:11","slug":"custom-compilers","status":"publish","type":"clion","link":"https:\/\/blog.jetbrains.com\/zh-hans\/clion\/2023\/03\/custom-compilers\/","title":{"rendered":"CLion \u4e2d\u7684\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\uff1a\u5173\u4e8e\u5728 CLion \u4e2d\u4f7f\u7528\u4efb\u610f\u7f16\u8bd1\u5668\u7684\u5feb\u901f\u6307\u5357"},"content":{"rendered":"<p>\u4f5c\u4e3a\u4e00\u6b3e IDE\uff0cCLion \u63d0\u4f9b\u4e86\u8bb8\u591a\u529f\u80fd\u6765\u5e2e\u52a9\u5f00\u53d1\u8005\u3002 \u5b83\u53ef\u4ee5\u663e\u793a\u6587\u6863\u5f39\u51fa\u7a97\u53e3\u3001\u5b9e\u65f6\u68c0\u6d4b\u9519\u8bef\u3001\u5efa\u8bae\u4fee\u590d\u7b49\u3002 \u5185\u90e8\u4ee3\u7801\u5206\u6790\u5668\u59cb\u7ec8\u5728\u540e\u53f0\u8fd0\u884c\uff0c\u5728\u60a8\u8f93\u5165\u65f6\u5206\u6790 C \u548c C++ \u4ee3\u7801\u3002 \u5bf9\u4e8e\u81ea\u52a8\u5206\u6790\u5668\u6765\u8bf4\uff0cC \u548c C++ \u662f\u5177\u6709\u6311\u6218\u6027\u7684\u8bed\u8a00\uff0c\u56e0\u4e3a\u9700\u8981\u7279\u5b9a\u4e8e\u7f16\u8bd1\u5668\u7684\u6570\u636e\u624d\u80fd\u6b63\u786e\u89e3\u6790\u4ee3\u7801\u3002 \u5f15\u64ce\u9700\u8981\u77e5\u9053\u6807\u9898\u641c\u7d22\u8def\u5f84\u3001\u9884\u5b9a\u4e49\u7684\u5b8f\u5b9a\u4e49\u548c\u5176\u4ed6\u4e00\u4e9b\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n<p>\u5bf9\u4e8e\u4e00\u7ec4\u9884\u5b9a\u4e49\u7684\u5df2\u77e5\u7f16\u8bd1\u5668\uff0cCLion \u4f1a\u4f7f\u7528\u7279\u6b8a\u9009\u9879\u8fd0\u884c\u9879\u76ee\u7684\u7f16\u8bd1\u5668\uff0c\u5e76\u5728\u89e3\u6790\u9879\u76ee\u65f6\u6536\u96c6\u6240\u9700\u4fe1\u606f\u3002 \u5f53\u7136\uff0c\u8fd9\u53ea\u9002\u7528\u4e8e\u6709\u9650\u6570\u91cf\u7684\u7f16\u8bd1\u5668\uff0c\u5982 GCC\u3001Clang\u3001MSVC\u3001IAR \u53ca\u5176\u884d\u751f\u5de5\u5177\u3002 \u5982\u679c\u67d0\u4e2a\u9879\u76ee\u4f7f\u7528\u7279\u5b9a\u7684\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\u3001\u5f88\u5c11\u4f7f\u7528\u7684\u7f16\u8bd1\u5668\u6216\u6211\u4eec\u65e0\u6743\u8bbf\u95ee\u7684\u4e13\u6709\u7f16\u8bd1\u5668\u6765\u6b63\u786e\u96c6\u6210\uff0c\u5219 CLion \u65e0\u6cd5\u901a\u8fc7\u5176\u6807\u51c6\u8fc7\u7a0b\u8fdb\u884c\u4f7f\u7528\u3002 \u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u60a8\u53ef\u4ee5\u9009\u62e9\u4f7f\u7528<a href=\"https:\/\/www.jetbrains.com.cn\/help\/clion\/custom-compilers.html\" target=\"_blank\" rel=\"noopener\"><em>\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668<\/em><\/a>\u529f\u80fd\u3002<\/p>\n<p>\u8981\u5728 CLion \u4e2d\u4f7f\u7528\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\uff0c\u60a8\u9700\u8981\u4e00\u4e2a\u5305\u542b\u5fc5\u8981\u7f16\u8bd1\u5668\u6570\u636e\u7684 YAML \u6587\u4ef6\u3002 \u6b64\u7c7b\u6587\u4ef6\u5e94\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u5c0f\u8282\uff0c\u6bcf\u4e2a\u5c0f\u8282\u63cf\u8ff0\u4e00\u4e2a\u7279\u5b9a\u7684\u7f16\u8bd1\u5668\u6216\u7f16\u8bd1\u5668\u53d8\u4f53\u3002 \u6bcf\u4e2a\u5c0f\u8282\u5e94\u6709\u4e00\u4e2a\u63cf\u8ff0\u3001\u4e00\u4e2a\u6216\u591a\u4e2a\u5339\u914d\u8bb0\u5f55\uff0c\u4ee5\u53ca\u591a\u4e2a\u4fe1\u606f\u8bb0\u5f55\u3002<\/p>\n<p>\u5f53 CLion \u89e3\u6790\u9879\u76ee\u5e76\u9047\u5230\u9488\u5bf9\u9879\u76ee\u6587\u4ef6\u7684\u7f16\u8bd1\u5668\u65f6\uff0cCLion \u4f1a\u9010\u8282\u626b\u63cf\uff0c\u5e76\u68c0\u67e5\u7f16\u8bd1\u5668\u662f\u5426\u4e0e\u8bb0\u5f55\u5339\u914d\u3002 \u5339\u914d\u4f1a\u4f7f\u7528\u4e00\u4e2a\u6216\u591a\u4e2a\u5339\u914d\u8bb0\u5f55\u6765\u5b8c\u6210\u3002 \u53ef\u7528\u7684\u5339\u914d\u8bb0\u5f55\u5305\u62ec\uff1a<\/p>\n<ul>\n<li><code>match-compiler-exe<\/code> \u662f\u6b63\u5219\u8868\u8fbe\u5f0f\uff0c\u7528\u6765\u68c0\u67e5\u7f16\u8bd1\u5668\u540d\u79f0\u3002 \u4e00\u4e2a\u4e0e\u5e73\u53f0\u65e0\u5173\u7684\u826f\u597d\u793a\u4f8b\u662f <code>\"(.*\/)?sdcc(.exe)?\"<\/code>\u3002<\/li>\n<li><code>match-source<\/code> \u4e5f\u662f\u6b63\u5219\u8868\u8fbe\u5f0f\uff0c\u7528\u6765\u4e0e\u8981\u7f16\u8bd1\u7684\u6e90\u6587\u4ef6\u7684\u540d\u79f0\u5339\u914d\u3002 \u5bf9\u4e8e C\uff0c\u901a\u5e38\u4e3a <code>\".*\\.c\"<\/code>\uff0c\u800c\u5bf9\u4e8e C++\uff0c\u901a\u5e38\u4e3a <code>\".*\\.cpp\"<\/code>\u3002<\/li>\n<li><code>match-args<\/code> \u662f\u5355\u4e2a\u547d\u4ee4\u884c\u5f00\u5173\u3001\u5f00\u5173\u5e8f\u5217\u6216\u65e0\u5e8f\u5f00\u5173\u6570\u7ec4\u3002 \u4f8b\u5982\uff0c<code>\"-a\"<\/code> \u5339\u914d\u5b9e\u53c2 <code>-a<\/code>\uff0c<code>\"-b -c\"<\/code> \u5339\u914d\u5b9e\u53c2 <code> -b -c<\/code>\uff0c\u800c <code>[\"-b\", \"-c\"]<\/code> \u5339\u914d <code>-b -c<\/code> \u6216 <code>-c -b<\/code>\u3002<\/li>\n<li><code>match-language <\/code>\u53ef\u80fd\u4e3a <code>C<\/code> \u6216 <code>CPP<\/code>\u3002 \u5bf9\u4e8e CMake \u9879\u76ee\uff0c\u5b83\u4f1a\u4e0e CMake \u68c0\u6d4b\u5230\u7684\u8bed\u8a00\u5339\u914d\uff1b\u5bf9\u4e8e\u5176\u4ed6\u7c7b\u578b\u7684\u9879\u76ee\uff0c\u8be5\u8bed\u53e5\u4f1a\u88ab\u76f4\u63a5\u5ffd\u7565\u3002<\/li>\n<\/ul>\n<p>\u5728\u6240\u6709\u5339\u914d\u9879\u6210\u529f\u89e3\u6790\u4e4b\u540e\uff0c\u5c31\u4f1a\u9009\u53d6\u5c0f\u8282\u4fe1\u606f\u8bb0\u5f55\uff0c\u5e76\u8df3\u8fc7 YAML \u6587\u4ef6\u7684\u5176\u4f59\u90e8\u5206\u3002 \u7f16\u8bd1\u5668\u6570\u636e\u83b7\u53d6\u81ea\u4fe1\u606f\u8bb0\u5f55\uff0c\u7136\u540e\u76f4\u63a5\u4f20\u9012\u7ed9 CLion \u7684\u4ee3\u7801\u5206\u6790\u5668\uff1b\u4e5f\u5c31\u662f\u8bf4\uff0c\u5728\u7f16\u8bd1\u5668\u8bd5\u8fd0\u884c\u671f\u95f4\u4e0d\u6536\u96c6\u6570\u636e\u3002<\/p>\n<p>\u5982\u679c\u8fd9\u4e9b\u5c0f\u8282\u90fd\u6ca1\u6709\u4e3a IDE \u63d0\u4f9b\u5c06\u8bb0\u5f55\u4e0e\u7279\u5b9a\u7f16\u8bd1\u5668\u79ef\u6781\u5339\u914d\u7684\u4fe1\u606f\uff0c\u5b83\u4f1a\u5c1d\u8bd5\u4ee5\u901a\u5e38\u7684\u65b9\u5f0f\uff08\u5373\u901a\u8fc7\u731c\u6d4b\u7f16\u8bd1\u5668\u7684\u7c7b\u578b\u5e76\u8fd0\u884c\u7f16\u8bd1\u5668\uff09\u6765\u6536\u96c6\u7f16\u8bd1\u5668\u6570\u636e\u3002<\/p>\n<h2 id=\"how_to_write_a_custom_compiler_yaml_file\">\u5982\u4f55\u7f16\u5199\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668 YAML \u6587\u4ef6<\/h2>\n<p>\u8981\u5f00\u59cb\u7f16\u5199\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668 YAML \u6587\u4ef6\uff0c\u60a8\u9700\u8981\u786e\u5b9a\u6709\u5173\u60a8\u7684\u7f16\u8bd1\u5668\u7684\u4ee5\u4e0b\u8be6\u7ec6\u4fe1\u606f\uff1a<\/p>\n<ul>\n<li>\u60a8\u5e0c\u671b\u652f\u6301\u7684\u8bed\u8a00\u3002 \u6bcf\u79cd\u53d7\u652f\u6301\u7684\u8bed\u8a00\u6216\u8bed\u8a00\u53d8\u4f53\u90fd\u9700\u8981\u81f3\u5c11\u4e00\u4e2a\u914d\u7f6e\u5c0f\u8282\u3002<\/li>\n<li>\u7f16\u8bd1\u5668\u4e8c\u8fdb\u5236\u6587\u4ef6\u540d\u79f0\u3002 \u53ef\u4ee5\u6709\u4e0d\u6b62\u4e00\u4e2a\u3002 \u4e00\u4e9b\u5de5\u5177\u94fe\u5177\u6709\u4e0d\u540c\u7684 C \u548c C++ \u7f16\u8bd1\u5668\u4e8c\u8fdb\u5236\u6587\u4ef6\u3001\u4e0d\u540c\u7684\u5185\u5b58\u6a21\u578b\u3001\u4e0d\u540c\u7684\u8bed\u8a00\u53d8\u4f53\u7b49\u3002 \u8fd9\u4e9b\u4fe1\u606f\u53ef\u4ee5\u5728\u5de5\u5177\u94fe\u6587\u6863\u4e2d\u627e\u5230\uff0c\u5e76\u4e14\u5fc5\u987b\u53cd\u6620\u5728\u60a8\u7684\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668 YAML \u6587\u4ef6\u4e2d\u3002<\/li>\n<li>\u6807\u51c6<em>\u5305\u542b<\/em>\u6587\u4ef6\u6240\u5728\u7684\u76ee\u5f55\u3002 \u8981\u6807\u8bc6\u8fd9\u4e9b\u76ee\u5f55\uff0c\u8bf7\u9605\u8bfb\u7f16\u8bd1\u5668\u7684\u6587\u6863\u6216\u76f4\u63a5\u6d4f\u89c8\u5df2\u5b89\u88c5\u7684\u5de5\u5177\u94fe\u6587\u4ef6\u5939\u6811\u3002<\/li>\n<li>\u9884\u5b9a\u4e49\u5b8f\u7684\u5217\u8868\u3002 \u4e00\u4e9b\u7f16\u8bd1\u5668\u53ef\u4ee5\u62a5\u544a\u9884\u5b9a\u4e49\u5b8f\u7684\u5217\u8868\uff0c\u800c\u5176\u4ed6\u7f16\u8bd1\u5668\u5219\u4e0d\u80fd\u3002 \u8bf7\u53c2\u8003\u60a8\u7684\u7f16\u8bd1\u5668\u6587\u6863\uff0c\u4ee5\u4e86\u89e3\u5982\u4f55\u4e3a\u60a8\u7684\u7f16\u8bd1\u5668\u83b7\u53d6\u5b83\u4eec\u3002<\/li>\n<\/ul>\n<h2 id=\"practical_example\">\u5b9e\u7528\u793a\u4f8b<\/h2>\n<p>\u6211\u4eec\u901a\u8fc7\u4e3a <a href=\"http:\/\/sdcc.sourceforge.net\/\" target=\"_blank\" rel=\"noopener\">Small Device C Compiler (SDCC)<\/a> \u7f16\u5199\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668 YAML \u6587\u4ef6\u6765\u5b9e\u8df5\u6b64\u8fc7\u7a0b\u3002 SDCC \u652f\u6301\u591a\u79cd 8 \u4f4d CPU \u67b6\u6784\uff0c\u5982 STM8\u3001Z80 \u7b49\u3002 \u8be5\u7f16\u8bd1\u5668\u662f\u5f00\u6e90\u7684\uff0c\u662f\u591a\u4e2a MCU \u7cfb\u5217\u4e2d\u552f\u4e00\u7684\u514d\u8d39\u7f16\u8bd1\u5668\u3002 \u5728\u6b64\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u5c06\u4e3a\u5176 Microchip PIC-16 \u53d8\u4f53\uff08\u7aef\u53e3\uff09\u7f16\u5199\u4e00\u4e2a YAML \u6587\u4ef6\u3002<\/p>\n<p>\u4ee5\u4e0b\u662f\u6211\u4eec\u9700\u8981\u4e86\u89e3\u7684\u6709\u5173\u6b64\u7f16\u8bd1\u5668\u7684\u8be6\u7ec6\u4fe1\u606f\uff1a<\/p>\n<ul>\n<li>\u4ec5\u652f\u6301 C \u8bed\u8a00\u3002<\/li>\n<li>\u7f16\u8bd1\u5668\u4e8c\u8fdb\u5236\u6587\u4ef6\u540d\u79f0\u4e3a <em>sdcc<\/em> \u6216 <em>sdcc.exe<\/em>\uff08\u5728 Windows \u4e2d\uff09\u3002<\/li>\n<li><code>-mpic16<\/code> \u9009\u9879\u5bf9\u4e8e PIC16 \u67b6\u6784\u652f\u6301\u662f\u5fc5\u9700\u7684\uff0c\u8fd8\u5e94\u8be5\u4f7f\u7528 <code>--use-non-free<\/code>\u3002<\/li>\n<li>\u8981\u62a5\u544a\u6807\u9898\u641c\u7d22\u8def\u5f84\u5217\u8868\uff0c\u7f16\u8bd1\u5668\u5e94\u4f7f\u7528 <code>--print-search-dirs<\/code> \u9009\u9879\u8fd0\u884c\u3002<\/li>\n<li>\u8981\u62a5\u544a\u9884\u5b9a\u4e49\u7684\u5b8f\uff0c\u7f16\u8bd1\u5668\u5e94\u4f7f\u7528 <code>-E<\/code> \u548c <code>-dM<\/code> \u9009\u9879\u548c\u4e00\u4e2a\u7a7a\u767d\u6e90\u6587\u4ef6\u8fd0\u884c\u3002<\/li>\n<\/ul>\n<p>\u6211\u4eec\u5c06\u4ece\u521b\u5efa\u4e00\u4e2a\u6d4b\u8bd5\u9879\u76ee\u5f00\u59cb\u3002 \u6b64\u6700\u5c0f\u9879\u76ee\u5305\u542b\u4e00\u4e2a C \u6587\u4ef6\u3001YAML \u6587\u4ef6\u672c\u8eab\u548c\u4e00\u4e2a\u6784\u5efa\u7cfb\u7edf\u6587\u4ef6\u3002 \u6211\u4eec\u5c06\u4f7f\u7528 <a href=\"https:\/\/www.jetbrains.com.cn\/help\/clion\/makefiles-support.html\" target=\"_blank\" rel=\"noopener\">Makefile<\/a>\u3002 \u5982\u679c\u8981\u4f7f\u7528 C++\uff0c\u90a3\u4e48\u8fd8\u5e94\u8be5\u6dfb\u52a0\u53e6\u4e00\u4e2a\u4f7f\u7528 C++ \u7f16\u5199\u7684\u6e90\u6587\u4ef6\u3002<\/p>\n<p>\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u9879\u76ee\u6587\u4ef6\u5939\uff0c\u5e76\u5728\u91cc\u9762\u521b\u5efa\u4e00\u4e2a\u7a7a\u767d <em>Makefile<\/em>\u3002<\/p>\n<p>\u5728 CLion \u4e2d\u6253\u5f00\u8be5\u6587\u4ef6\u5939\uff0c\u7136\u540e\u5728\u5f39\u51fa\u7684 <em>Load Project<\/em>\uff08\u52a0\u8f7d\u9879\u76ee\uff09\u5bf9\u8bdd\u6846\u4e2d\u70b9\u51fb <em>Cancel<\/em>\uff08\u53d6\u6d88\uff09\u3002<\/p>\n<p>\u5728 CLion \u7f16\u8f91\u5668\u4e2d\u6253\u5f00 <em>Makefile<\/em>\uff0c\u5e76\u5c06\u6700\u5c11\u5185\u5bb9\u6dfb\u52a0\u5230\u8be5 <em>Makefile<\/em>\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">clean:\n    all: main.c\n    sdcc -mpic16 --use-non-free -S main.c<\/pre>\n<p>\u8be5\u6587\u4ef6\u73b0\u5728\u5305\u542b\u4e00\u4e2a\u7528\u4e8e\u5728\u4e0d\u9700\u8981\u66f4\u591a\u6b65\u9aa4\u7684\u60c5\u51b5\u4e0b\u5c06 main.c \u7f16\u8bd1\u6210\u7a0b\u5e8f\u96c6\u7684\u547d\u4ee4\u3002<\/p>\n<p>\u521b\u5efa\u4e00\u4e2a <em>main.c<\/em> \u6587\u4ef6\u3002 \u6211\u4eec\u6765\u521b\u5efa\u4e00\u4e2a\u7ecf\u5178\u7684 \u201cHello, World\u201d\uff0c\u5e76\u5e26\u6709\u989d\u5916\u7279\u5b9a\u4e8e SDCC \u7684\u9644\u52a0\u5185\u5bb9\uff0c\u5373<code>__code<\/code> \u5173\u952e\u5b57\u548c\u9884\u5b9a\u4e49\u7684\u5b8f <code>__SDCC_pic16<\/code>\u3002<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">#include &lt;stdio.h&gt;\nint main() {\n    printf(\"Hello, World!n\");\n    return 0;\n}\nint __code i = 0;\n#ifndef __SDCC_pic16\n#  error \"__SDCC_pic16 macro is expected to be defined\"\n#endif<\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u7f16\u5199\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\u914d\u7f6e\u5b58\u6839\uff1a<\/p>\n<ol>\n<li>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a <em>clion-custom-compiler-sdcc-pic16.yaml<\/em> \u7684\u6587\u4ef6\u3002<\/li>\n<li>\u5c06 JSON \u67b6\u6784\u201cCustom Compiler Definition\u201d\u5206\u914d\u7ed9\u8be5\u6587\u4ef6\u3002<br \/><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/09\/image1.png\" alt=\"Custom compiler scheme validated\" width=\"486.5\" \/>\u8fd9\u6837\uff0cCLion \u53ef\u4ee5\u901a\u8fc7\u52a8\u6001\u6587\u4ef6\u7ed3\u6784\u9a8c\u8bc1\u548c\u8f93\u5165\u63d0\u793a\u4e3a\u60a8\u63d0\u4f9b\u5e2e\u52a9\u3002 \u67b6\u6784\u540d\u79f0\u663e\u793a\u5728 IDE \u72b6\u6001\u680f\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7\u70b9\u51fb\u540d\u79f0\u8fdb\u884c\u9009\u62e9\u3002<\/li>\n<\/ol>\n<p>\u5b58\u6839\u4e3a\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">compilers:\n - description: SDCC for PIC-16\n   match-compiler-exe: \"(.*\/)?sdcc(.exe)?\"<\/pre>\n<p>\u76ee\u524d\uff0c\u6211\u4eec\u53ea\u901a\u8fc7\u540d\u79f0\u8fdb\u884c\u5339\u914d\u3002 \u5b83\u662f\u4e00\u4e2a\u5339\u914d Linux \u548c Windows \u7f16\u8bd1\u5668\u4e8c\u8fdb\u5236\u6587\u4ef6\u540d\u79f0\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\uff0c\u65e0\u8bba\u5305\u542b\u6587\u4ef6\u5939\u662f\u4ec0\u4e48\u3002<\/p>\n<p>\u4e0b\u4e00\u6b65\u662f\u5728 CLion \u4e2d\u4f7f\u7528\u6211\u4eec\u7684\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\u914d\u7f6e\u3002 \u6253\u5f00 <em>Settings\/Preferences | Build, Execution, Deployment | Toolchains | Custom Compiler<\/em>\uff08\u8bbe\u7f6e\/\u504f\u597d\u8bbe\u7f6e | \u6784\u5efa\u3001\u6267\u884c\u3001\u90e8\u7f72 | \u5de5\u5177\u94fe | \u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\uff09\u3002 \u9009\u4e2d <em>Use custom compiler config<\/em>\uff08\u4f7f\u7528\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\u914d\u7f6e\uff09\uff0c\u5e76\u9009\u62e9\u9879\u76ee\u7684 YAML \u6587\u4ef6\u4f5c\u4e3a\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/09\/image6.png\" alt=\"\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\u8bbe\u7f6e\" width=\"600\" \/><\/p>\n<p>\u5728 <em>Tools<\/em>\uff08\u5de5\u5177\uff09\u83dc\u5355\u4e2d\u9009\u62e9 <em>Makefile | Clean and Reload Makefile Project<\/em>\uff08Makefile | \u6e05\u7406\u5e76\u91cd\u65b0\u52a0\u8f7d Makefile \u9879\u76ee\uff09\u3002\u5982\u679c\u4e00\u5207\u6b63\u5e38\uff0cBuild\uff08\u6784\u5efa\uff09\u5de5\u5177\u7a97\u53e3\u5c06\u663e\u793a\u9879\u76ee\u5df2\u6210\u529f\u52a0\u8f7d\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/09\/image3.png\" alt=\"\u9879\u76ee\u5df2\u52a0\u8f7d\" width=\"488\" \/><\/p>\n<p>\u5982\u679c\u9879\u76ee\u672a\u6b63\u786e\u52a0\u8f7d\uff0c\u5219\u5e94\u4ed4\u7ec6\u68c0\u67e5 YAML \u6587\u4ef6\u4e2d\u7684 <em>match-compiler-exe<\/em> \u8bed\u53e5\u3002 \u8bb0\u5f55\u503c\u662f\u4e00\u4e2a\u6b63\u5219\u8868\u8fbe\u5f0f\uff0c\u5b83\u662f\u8be5\u8fc7\u7a0b\u4e2d\u6700\u8106\u5f31\u7684\u90e8\u5206\u3002 \u5982\u6709\u95ee\u9898\uff0c\u8bf7\u53c2\u8003\u8fd9\u4e9b<a href=\"https:\/\/github.com\/JetBrains\/clion-custom-defined-compiler-examples\/tree\/master\/configs\" target=\"_blank\" rel=\"noopener\">\u793a\u4f8b<\/a>\u3002<\/p>\n<p>\u73b0\u5728\uff0c\u6211\u4eec\u6765\u770b\u770b CLion \u662f\u5426\u771f\u7684\u9002\u914d\u4e86 SDCC\uff0c\u6211\u4eec\u7684\u9879\u76ee\u662f\u5426\u6309\u9884\u671f\u8fd0\u884c\u3002<\/p>\n<h2 id=\"check_that_the_custom_compiler_works\">\u68c0\u67e5\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\u662f\u5426\u6b63\u5e38\u8fd0\u884c<\/h2>\n<p>\u5728\u7f16\u8f91\u5668\u4e2d\u6253\u5f00 <em>main.c<\/em>\u3002 \u6b64\u65f6\u770b\u5230\u4e00\u4e9b\u9519\u8bef\u6ca1\u6709\u5173\u7cfb\u3002 \u8f6c\u5230 <em>Help | Diagnostics Tools<\/em>\uff08\u5e2e\u52a9 | \u8bca\u65ad\u5de5\u5177\uff09\uff0c\u9009\u62e9 <em>Show Compiler Info<\/em>\uff08\u663e\u793a\u7f16\u8bd1\u5668\u4fe1\u606f\uff09\u3002 \u8fd9\u5c06\u6253\u5f00\u4e00\u4e2a\u8bca\u65ad\u9875\u9762\uff0c\u5176\u4e2d\u5305\u542b\u6b63\u5728\u7f16\u8f91\u7684\u6587\u4ef6\u7684\u7f16\u8bd1\u5668\u4fe1\u606f\u3002 \u5728\u8fd9\u91cc\uff0c\u60a8\u53ef\u4ee5\u770b\u5230\u7f16\u8bd1\u5668\u79cd\u7c7b\uff08\u201cCustom Defined Compiler\u201d\uff09\u548c\u68c0\u6d4b\u5230\u7684\u7f16\u8bd1\u5668\u63cf\u8ff0\uff08\u201cSDCC for PIC-16\u201d\uff09\u3002 \u8fd9\u610f\u5473\u7740 CLion \u611f\u77e5\u5230\u4e86\u9879\u76ee\u7ed3\u6784\uff0c\u4f46\u662f\u4ee3\u7801\u5206\u6790\u5668\u8fd8\u6ca1\u6709\u6240\u9700\u7684\u7f16\u8bd1\u5668\u6570\u636e\uff0c\u56e0\u6b64\u5728 <em>main.c<\/em> \u4e2d\u663e\u793a\u4e86\u5404\u79cd\u9519\u8bef\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/09\/image5.png\" alt=\"\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\u6b63\u5e38\u8fd0\u884c\" width=\"586\" \/><\/p>\n<h2 id=\"collect_missing_compiler_information\">\u6536\u96c6\u7f3a\u5c11\u7684\u7f16\u8bd1\u5668\u4fe1\u606f<\/h2>\n<p>\u6211\u4eec\u7684 <em>main.c<\/em> \u6587\u4ef6\u76ee\u524d\u4f3c\u4e4e\u5df2\u635f\u574f\u3002 \u627e\u4e0d\u5230 <em>stdio.h<\/em>\uff0c<code>printf<\/code> \u672a\u5b9a\u4e49\uff0c<code>__code<\/code> \u4fee\u9970\u7b26\u9519\u8bef\uff0c\u5e76\u4e14\u672a\u5b9a\u4e49\u6587\u6863\u4e2d\u7684\u9884\u5b9a\u4e49\u5b8f\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/09\/image4.png\" alt=\"\u627e\u4e0d\u5230 stdio\" width=\"600\" \/><\/p>\n<p>\u6211\u4eec\u6765\u901a\u8fc7\u63d0\u4f9b\u6b63\u786e\u7684\u7f16\u8bd1\u5668\u4fe1\u606f\u4fee\u6b63\u6240\u6709\u8fd9\u4e9b\u95ee\u9898\u3002<\/p>\n<p>\u5e78\u8fd0\u7684\u662f\uff0cSDCC \u53ef\u4ee5\u6253\u5370\u6807\u9898\u4f4d\u7f6e\u548c\u9884\u5b9a\u4e49\u7684\u5b8f\u3002 \u5c06\u4ee5\u4e0b\u5404\u884c\u6dfb\u52a0\u5230 <em>Makefile<\/em> \u5373\u53ef\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">gather_info:\n#   List directories\n    sdcc -mpic16 --use-non-free --print-search-dirs\n#   Create a void C file\n    echo \/\/void &gt; void.c\n#   List predefined macros\n    sdcc -mpic16 --use-non-free -E -dM void.c<\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u6784\u5efa <em>gather_info<\/em> \u76ee\u6807\u5e76\u67e5\u770b\u8f93\u51fa\u3002 \u9996\u5148\uff0c\u6709\u4e00\u4e2a\u6807\u9898\u641c\u7d22\u8def\u5f84\u5217\u8868\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">\u2026\nincludedir:\nC:Program FilesSDCCbin..includepic16\nC:Program FilesSDCCbin..include\nC:Program FilesSDCCbin..non-freeincludepic16\nC:Program FilesSDCCbin..non-freeinclude\n\u2026<\/pre>\n<p>\u552f\u4e00\u7684\u95ee\u9898\u662f\u8fd9\u4e9b\u8def\u5f84\u662f\u7edd\u5bf9\u8def\u5f84\u3002 \u51fa\u4e8e\u53ef\u79fb\u690d\u6027\u539f\u56e0\uff0c\u6211\u4eec\u5c06\u5b83\u4eec\u8bbe\u4e3a\u76f8\u5bf9\u4e8e\u7f16\u8bd1\u5668\u4f4d\u7f6e\uff0c\u5e76\u5c06\u5b83\u4eec\u4f5c\u4e3a <em>include-dirs<\/em> \u6570\u7ec4\u6dfb\u52a0\u5230\u7f16\u8bd1\u5668\u5b9a\u4e49\u4e2d\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\u662f\u9884\u5b9a\u4e49\u7684\u5b8f\u3002 \u5b83\u4eec\u88ab\u6253\u5370\u5728\u8f93\u51fa\u7684\u6700\u5e95\u90e8\u3002 \u53ef\u4ee5\u901a\u8fc7 <em>defines-text<\/em> \u5c06\u5b83\u4eec\u6dfb\u52a0\u5230 YAML \u6587\u4ef6\u3002<\/p>\n<p>\u6700\u540e\u4f46\u540c\u6837\u91cd\u8981\u7684\u662f\uff0c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u4f7f\u7528 <code>match-args: -mpic16<\/code> \u548c <code> match-language: C<\/code> \u8bed\u53e5\u4f7f\u6211\u4eec\u7684\u7f16\u8bd1\u5668\u5339\u914d\u5f97\u66f4\u5177\u4f53\u4e00\u4e9b\uff0c\u7136\u540e\u4f5c\u4e3a\u7a7a\u5b9a\u4e49\u6dfb\u52a0 SDCC \u8bed\u8a00\u6269\u5c55\u5b57\u3002 \u5b8c\u6210\u540e\uff0c\u6700\u7ec8\u7684 YAML \u6587\u4ef6\u5c06\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">compilers:\n  - description: SDCC for PIC-16\n    match-compiler-exe: \"(.*\/)?sdcc(.exe)?\"\n    match-args: -mpic16\n    match-language: C\n    include-dirs:\n      - ${compiler-exe-dir}\/..\/include\/pic16\n      - ${compiler-exe-dir}\/..\/include\n      - ${compiler-exe-dir}\/..\/non-free\/include\/pic16\n      - ${compiler-exe-dir}\/..\/non-free\/include\n    defines-text: \"\n#define __SDCC_USE_NON_FREE 1\n#define __SDCC_PIC18F452 1\n#define __18f452 1\n#define __STACK_MODEL_SMALL 1\n#define __SDCC_pic16 1\n#define __SDCC_ALL_CALLEE_SAVES 1\n#define __STDC_VERSION__ 201112L\n#define __STDC_HOSTED__ 0\n#define __SDCCCALL 0\n#define __STDC_UTF_16__ 1\n#define __SDCC_VERSION_MINOR 2\n#define __STDC_ISO_10646__ 201409L\n#define __SDCC_VERSION_PATCH 0\n#define __SDCC_VERSION_MAJOR 4\n#define __STDC_NO_VLA__ 1\n#define __SDCC 4_2_0\n#define __STDC_UTF_32__ 1\n#define __STDC_NO_THREADS__ 1\n#define __SDCC_CHAR_UNSIGNED 1\n#define __STDC_NO_ATOMICS__ 1\n#define __STDC__ 1\n#define __SDCC_REVISION 13081\n#define __STDC_NO_COMPLEX__ 1\n\n#define __interrupt\n#define __code\n#define __at\n\"<\/pre>\n<p>\u73b0\u5728\uff0c\u6211\u4eec\u53ef\u4ee5\u91cd\u65b0\u52a0\u8f7d\u9879\u76ee <em>Tools | Makefile | Reload Makefile Project<\/em>\uff08\u5de5\u5177 | Makefile | \u91cd\u65b0\u52a0\u8f7d Makefile \u9879\u76ee\uff09\u5e76\u518d\u6b21\u68c0\u67e5 <em>main.c<\/em> \u6587\u4ef6\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/09\/image2.png\" alt=\"\u89e3\u6790\u6b63\u5e38\u8fd0\u884c\" width=\"600\" \/><\/p>\n<p>\u9519\u8bef\u5df2\u7ecf\u6d88\u5931\uff0c\u5e76\u4e14\u53ef\u4ee5\u5bfc\u822a\u5230 <em>stdio.h<\/em>\u3002 <em>Show Compiler Info<\/em>\uff08\u663e\u793a\u7f16\u8bd1\u5668\u4fe1\u606f\uff09\u7a97\u53e3\u663e\u793a\u4e86\u6b63\u786e\u7684\u4fe1\u606f\uff0c\u5305\u62ec\u9884\u5b9a\u4e49\u7684\u5b8f\u3001\u8bed\u8a00\u529f\u80fd\u548c\u6807\u9898\u641c\u7d22\u8def\u5f84\u3002<\/p>\n<p>\u8fd9\u4e2a\u6700\u7ec8\u7684 YAML \u6587\u4ef6\u53ef\u4ee5\u5728 <a href=\"https:\/\/github.com\/JetBrains\/clion-custom-defined-compiler-examples\/tree\/master\/Makefile-SDCC-pic16\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> \u4e0a\u627e\u5230\u3002<\/p>\n<p>\u5c31\u662f\u8fd9\u6837\uff01 \u4e3a\u60a8\u7684\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668\u5c1d\u8bd5<em>\u81ea\u5b9a\u4e49\u7f16\u8bd1\u5668<\/em>\u529f\u80fd\uff0c\u5e76\u544a\u8bc9\u6211\u4eec\u6548\u679c\u5982\u4f55\u3002 \u6b22\u8fce\u5411\u6211\u4eec\u7684<a href=\"https:\/\/github.com\/JetBrains\/clion-custom-defined-compiler-examples\/\" target=\"_blank\" rel=\"noopener\">\u7f16\u8bd1\u5668\u652f\u6301\u96c6\u5408<\/a>\u63d0\u4ea4\u62c9\u53d6\u8bf7\u6c42\uff01<\/p>\n<p>\u00a0<\/p>\n<p>\u672c\u535a\u6587\u82f1\u6587\u539f\u4f5c\u8005\uff1a<\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n\n","protected":false},"author":1297,"featured_media":277040,"comment_status":"closed","ping_status":"closed","template":"","categories":[1401,601],"tags":[6788,3506,3581,3551],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/clion\/329853"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/clion"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/types\/clion"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/users\/1297"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/comments?post=329853"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/clion\/329853\/revisions"}],"predecessor-version":[{"id":329857,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/clion\/329853\/revisions\/329857"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/media\/277040"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/media?parent=329853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/categories?post=329853"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/tags?post=329853"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/zh-hans\/wp-json\/wp\/v2\/cross-post-tag?post=329853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}