【cmake】CMakeList添加庫|添加頭文件|添加路徑|add_executable、add_library、target_link_libraries|添加編譯選項|宏開關(guān)
目錄
官網(wǎng)查閱
開胃菜例子
CMakeLists生成和添加依賴庫
1、目錄結(jié)構(gòu)
2、CMakeLists.txt
3、configure and generate
4、截圖:
5、其他設(shè)置
add_library(生成庫),target_link_libraries(生成目標(biāo)連接的庫),set_target_properties
CMAKE 添加編譯選項|-g編譯參數(shù)/選項
包含文件的的目錄include_directories
CMake設(shè)置編譯參數(shù)/選項
如何在cmakelists中加入-ldl編譯選項
CMake指定gcc,g++版本編譯
CMake 關(guān)閉警告的方法
關(guān)閉編譯器優(yōu)化
Debug和Release 方案
About table
About question
CMakeLists 實現(xiàn)動態(tài)宏開關(guān)
去掉編譯優(yōu)化
CMake--List用法
CmakeLists.txt單行注釋和多行注釋
官網(wǎng)查閱
Search — CMake 3.22.0-rc1 Documentation
開胃菜例子
生成一個可執(zhí)行程序的 CMakeList
#添加包含文件的的目錄
include_directories(${cppzmq_INCLUDE_DIR})
#用${SOURCE_FILES}指定的文件,生成可執(zhí)行文件sample_project
add_executable(sample_project ${SOURCE_FILES})
#生成可執(zhí)行文件sample_project 需要連接 ${CMAKE_THREAD_LIBS_INIT}指定的庫
target_link_libraries (sample_project ${CMAKE_THREAD_LIBS_INIT})
生成一個.so動態(tài)庫的 CMakeList
#用${SRC_LISTS}指定的所有的源文件生成一個庫,名字叫l(wèi)ibsugan
add_library(libsugan ${SRC_LISTS})
#生成libsugan庫需要鏈接 ${OpenCV_LIBS}、 ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so、${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
target_link_libraries(libsugan
${OpenCV_LIBS}
${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so
${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
)
原文鏈接:https://blog.csdn.net/bandaoyu/article/details/115165199
CMakeLists生成和添加依賴庫
原文;cmake之生成動態(tài)庫 - mohist - 博客園
1、目錄結(jié)構(gòu)
│ CMakeLists.txt
│ index.txt
│
├─build
├─include
│ hello.h
│ hi.h
│
└─src
hello.cxx
hi.cxx
2、CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
#項目名
project(libhello)
# 1、指定庫的目錄變量
set(libhello_src src/hello.cxx)
# 指定頭文件搜索路徑
include_directories("${PROJECT_SOURCE_DIR}/include")
# 2、添加庫(對應(yīng)的兩個項目)
add_library( hello_shared SHARED ${libhello_src})
add_library( hello_static STATIC ${libhello_src})
# 按照一般的習(xí)慣,靜態(tài)庫名字跟動態(tài)庫名字應(yīng)該是一致的,只是擴展名不同;
# 即:靜態(tài)庫名為 libhello.a; 動態(tài)庫名為libhello.so ;
# 所以,希望 "hello_static" 在輸出時,不是"hello_static",而是以"hello"的名字顯示,故設(shè)置如下
# SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")
# 3、cmake在構(gòu)建一個新的target時,會嘗試清理掉其他使用這個名字的庫,
# 因此,在構(gòu)建libhello.a時,就會清理掉libhello.so.
# 為了回避這個問題,比如再次使用SET_TARGET_PROPERTIES定義 CLEAN_DIRECT_OUTPUT屬性。
SET_TARGET_PROPERTIES (hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES (hello_shared PROPERTIES CLEAN_DIRECT_OUTPUT 1)
# 4、按照規(guī)則,動態(tài)庫是應(yīng)該包含一個版本號的,
# VERSION指代動態(tài)庫版本,SOVERSION指代API版本。
SET_TARGET_PROPERTIES (hello_static PROPERTIES VERSION 1.1 SOVERSION 1)
SET_TARGET_PROPERTIES (hello_shared PROPERTIES VERSION 1.1 SOVERSION 1)
# 5、若將libhello.a, libhello.so.x以及hello.h安裝到系統(tǒng)目錄,才能真正讓其他人開發(fā)使用,
# 本例中,將hello的共享庫安裝到<prefix>/lib目錄;
# 將hello.h安裝<prefix>/include/hello目錄。
#INSTALL (TARGETS hello hello_shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
#INSTALL (TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
#INSTALL (FILES hello.h DESTINATION include/hello)
3、configure and generate
xxx/to/path
cd build
cmake ..
4、截圖:
mac沒有電了, 來個Windows10的截圖吧:
5、其他設(shè)置
若需要指定輸出路徑,嘗試下面的示例指令:
# 設(shè)置VS會自動新建Debug和Release文件夾
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Bin)
# 設(shè)置分別設(shè)置Debug和Release輸出目錄
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/../../build/Debug)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/Bin)
簡單例子:
一、生成.so共享庫文件
下面是我的幾個文件:
1hello.cpp
//hello.cpp
int Calculate_sum_Of_Two_Number(int x,int y)
{
int z=0;
z=x+y;
return (z);
}
2hello.hpp
//hello.hpp
#ifndef __HELLO_H
#define __HELLO_H
int Calculate_sum_Of_Two_Number(int x,int y);
#endif
3 main.cpp
//main.cpp
#include "hello.hpp"
#include <stdio.h>
int main(void)
{
int a=0,b=0,c=0;
printf("please input two parameter:");
scanf("%d",&a);
scanf("%d",&b);
c=Calculate_sum_Of_Two_Number(a,b);
printf("the sum is : %d",c);
return 0;
}
4 CMakeLists.txt
#要求的Cmake最低版本
CMAKE_MINIMUM_REQUIRED( VERSION 2.8)
#工程名稱
PROJECT(main)
#設(shè)置編譯器編譯模式:
set( CMAKE_BUILD_TYPE "Debug" )
#生成共享庫
#get the shared package
#here needs no .hpp
add_library(calculate_shared SHARED hello.cpp)
#生成可以執(zhí)行的文件
add_executable(main main.cpp)
#連接共享庫
target_link_libraries(main calculate_shared)
上面CmakeLists.txt里面, 共享庫的名稱是calculate_shared,這個是我們可以自己更改的。生成的可執(zhí)行文件是main, 這個名稱也是可以更改的。
不過需要注意的是,hello.cpp里面不用在包含hello.hpp 了。(汗,因為這個導(dǎo)致出錯,提示說是重復(fù)定義函數(shù)了);
編譯生成:
mkdir build
cd build
cmake ..
make
我們就可以看到build生成了 如下的文件:
CMakeCache.txt cmake_install.cmake main
CMakeFiles libcalculate_shared.so Makefile
libcalculate_shared.so就是生成的共享庫文件。
他們的路徑是:/home/fan/dev/cmake/4-exer/
下面有build文件夾,以及main.cpp, hello.cpp, hello.hpp,
build文件夾下面有共享庫 libcalculate_shared.so.so
二、調(diào)用共享庫文件
所有的外部依賴庫都是這樣的,比如opencv ,openni, eigen等等,原理是一樣的,只不過他們已經(jīng)安裝在系統(tǒng)里面了,可以查找,而這個則是需要我們自己去配置。
即我上面生成的共享庫文件本質(zhì)上和opencv的庫是相同的。只不過這個共享庫需要自己手動配置。
比如我又新建了一個工程,需要調(diào)用上面的共享庫 libcalculate_shared.so。
main.cpp如下:
//main.cpp
#include <stdio.h>
#include <iostream>
#include "hello.hpp"
using namespace std;
int main(void)
{
int x=2,y=3;
int z=0;
z=Calculate_sum_Of_Two_Number(x,y);
cout<<"the result is:"<<z<<endl;
return 0;
}
那么在CMakeLists.txt里面,我需要告訴CMake, 這個頭文件可以在哪里找到,頭文件所定義的函數(shù)又可以在哪里找到。
上面hello.hpp的路徑是:/home/fan/dev/cmake/4-exer/hello.hpp
libcalculate_shared.so的路徑是/home/fan/dev/cmake/4-exer/build/libcalculate_shared.so
則CMakeLists.txt如下:
CMAKE_MINIMUM_REQUIRED( VERSION 2.8)
PROJECT(main)
#設(shè)置編譯器編譯模式:
SET( CMAKE_BUILD_TYPE "Debug" )
SET(HELLO_INCLUE
/home/fan/dev/cmake/4-exer/)
SET(HELLO_SRC
/home/fan/dev/cmake/4-exer/build/libcalculate_shared.so)
INCLUDE_DIRECTORIES(${HELLO_INCLUE})
add_executable(main main.cpp)
target_link_libraries(main ${HELLO_SRC})
這里要注意一些細(xì)節(jié)(對于我這個渣渣來說的)
1、${ }這種形式代表一個變量,比如上面的,HELLO_INCLUE ,就是我自己定義的一個變量。
2、頭文件包含到頭文件所在的文件夾,即 /home/fan/dev/cmake/4-exer/
3、共享庫要指明具體的共享庫 ,精確到.so
其實主要的就是指明這個調(diào)用這個共享庫的時候,使用的頭文件,以及共享庫本身所在的位置,然后包含鏈接就可以了。
安裝過的共享庫(例如opencv)就不用這么麻煩了,因為它的地址都放在了變量里面。
Opencv的依賴添加
比如Opencv, 它的頭文件和.so文件都已經(jīng)放在了系統(tǒng)變量里面,不用向上面自己定義了(上面例子里面的頭文件和共享庫文件的地址都是我自己設(shè)置的)
它的CMakeLists.txt如下:
find_package(OpenCV REQUIRED)
include_directories(${OPENCV_INCLUDE_DIRS})
target_link_libraries(MAIN ${OpenCV_LIBS})
只需要查找就可以了,OpenCV_LIBS 和 OPENCV_INCLUDE_DIRS 都是系統(tǒng)幫我們已經(jīng)定義好的,所以比較容易
參考博客:
1、如何寫自己的CmakeLists.txt https://www.cnblogs.com/chaofn/p/10160555.html
2、 【OpenCV】使用CMake鏈接自己路徑下面的OpenCV庫 https://blog.csdn.net/twt520ly/article/details/81981473
原文鏈接:https://blog.csdn.net/qq_37761077/article/details/88750711
add_library(生成庫),target_link_libraries(生成目標(biāo)連接的庫),set_target_properties
add_library(libsugan ${SRC_LISTS}) #用${SRC_LISTS}生成靜態(tài)庫libsugan
target_link_libraries(libsugan #生成靜態(tài)庫libsugan還需鏈接依賴庫${OpenCV_LIBS}…
${OpenCV_LIBS}
${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so
${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
)
#上面的配置生成名字為libsugan的靜態(tài)庫,但Linux下對庫的存儲格式是lib+name.a,所以庫libsugan存儲出來的結(jié)果就是liblibsugan.a,看著很別扭。用下面這句,保證了存儲出來的靜態(tài)庫叫做libsugan.a:
set_target_properties(libsugan PROPERTIES OUTPUT_NAME "sugan")
#但是請千萬注意,在整個CmakeLists.txt里
#如果想鏈接生成的這個庫必須使用 “add_library(libsugan ${SRC_LISTS})”指明的名字。
set_target_properties(libsugan PROPERTIES OUTPUT_NAME "sugan")
add_executable(demo ./src/main.cpp)
target_link_libraries(demo libsugan)
原例子:
add_library,target_link_libraries,set_target_properties,target_link_libraries使用聯(lián)系_michaelhan3的博客-CSDN博客
#工程名字
project(Camera_sugan)
#編譯最低cmake版本
cmake_minimum_required(VERSION 2.6)
#設(shè)置c++編譯器
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
#在整個電腦上找opencv包
find_package(OpenCV REQUIRED)
#包含頭文件路徑
include_directories(
./include/inudev/
./src/
)
#將所有的源文件列為一個集合,集合名字叫做SRC_LISTS
set(SRC_LISTS
./src/inuitive.cpp
./src/runCamera_Qfeeltech.cpp
)
#將集合里的所有的源文件生成一個靜態(tài)庫,該靜態(tài)庫的名字libsugan,
注意,在整個CmakeLists里都要用libsugan這個
add_library(libsugan ${SRC_LISTS})
#名字來代替之前那個集合生成的庫。
target_link_libraries(libsugan #鏈接靜態(tài)庫需要的依賴庫
${OpenCV_LIBS}
${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so
${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
)
原文鏈接:https://blog.csdn.net/michaelhan3/article/details/69568362
CMAKE 添加編譯選項|-g編譯參數(shù)/選項
add_definitions 和add_compile_options,二者添加的編譯選項是針對所有編譯器的(包括c和c++編譯器)。
add_definitions 和add_compile_options的區(qū)別是:
add_definitions 可用于添加任何標(biāo)志,但旨在添加預(yù)處理器定義。
此命令已被替代方案取代:
使用 add_compile_definitions() 添加預(yù)處理器定義。
使用 include_directories() 添加包含目錄。
使用 add_compile_options() 添加其他選項。
add_definitions — CMake 3.22.0-rc1 Documentation
添加 -g編譯參數(shù)/選項
方法一:add_definitions("-g")/ add_compile_options
在文件 CMakeLists.txt添加下面一條語句
add_definitions("-g")
添加其他編譯參數(shù)/選項
例如下面的代碼
#判斷編譯器類型,如果是gcc編譯器,則在編譯選項中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCXX)
add_compile_options(-std=c++11)
message(STATUS "optional:-std=c++11")
endif(CMAKE_COMPILER_IS_GNUCXX)
使用add_compile_options添加-std=c++11選項,是想在編譯c++代碼時加上c++11支持選項。但是因為add_compile_options是針對所有類型編譯器的,所以在編譯c代碼時,就會產(chǎn)生如下warning
J:\workspace\facecl.gcc>make b64
[ 50%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cdecode.c.obj
cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
[100%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cencode.c.obj
cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
Linking C static library libb64.a
[100%] Built target b64
雖然并不影響編譯,但看著的確是不爽啊,要消除這個warning,就不能使用add_compile_options,而是只針對c++編譯器添加這個option。
方法二:set
所以如下修改代碼,則警告消除。
#判斷編譯器類型,如果是gcc編譯器,則在編譯選項中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
message(STATUS "optional:-std=c++11")
endif(CMAKE_COMPILER_IS_GNUCXX)
原文鏈接:https://blog.csdn.net/qinglongzhan/article/details/80743731
包含文件的的目錄include_directories
include_directories(${cppzmq_INCLUDE_DIR}) //添加包含文件的的目錄
add_definitions 可用于添加任何標(biāo)志,但旨在添加預(yù)處理器定義。
此命令已被替代方案取代:
使用 add_compile_definitions() 添加預(yù)處理器定義。
使用 include_directories() 添加包含目錄。
使用 add_compile_options() 添加其他選項。
CMake設(shè)置編譯參數(shù)/選項
而set命令設(shè)置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS變量則是分別只針對c和c++編譯器的
對c編譯器的
set(CMAKE_C_FLAGS"-O3 -fopenmp -fPIC -Wno-deprecated -Wenum-compare -std=c++14")
針對c++編譯器的
set(CMAKE_CXX_FLAGS "-O3 -fopenmp -fPIC -Wno-deprecated -Wenum-compare -std=c++14")
如何在cmakelists中加入-ldl編譯選項
cmakelists.txt中,在增加可執(zhí)行程序后增加TARGET_LINK_LIBRARIES
eg:
add_executable(xx ${ALL_F} ${WE_F})
TARGET_LINK_LIBRARIES(dl)
TARGET_LINK_LIBRARIES(m)
set(CMAKE_C_FLAGS "-ldl")
在add_executable(${PROJECT_NAME} "main.cpp")后面添加
target_link_libraries(${PROJECT_NAME} dl)
target_link_libraries(exe1 -Wl, - -whole-archive lib1 -Wl, - no-whole-archive)
CMake指定gcc,g++版本編譯
系統(tǒng)默認(rèn)的gcc/g++在/usr/bin目錄下。
我們升級安裝的gcc目錄在/usr/local/bin目錄下,現(xiàn)在我們希望使用升級后的gcc。
通過百度搜索出來的結(jié)果,大多是如下操作:
在CMakeLists.txt中調(diào)用編譯器之前添加:
1
2
SET(CMAKE_C_COMPILER "/usr/local/bin/gcc")
SET(CMAKE_CXX_COMPILER "/usr/local/bin/g++")
然而經(jīng)過本人親自實踐,該方法不起作用,正確的做法是:
執(zhí)行cmake命令之前,在shell終端先設(shè)置如下兩個變量:
1
2
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
然后再執(zhí)行cmake等后續(xù)命令,這樣就可以用指定的編譯器版本了。
【已解決】CMake指定gcc,g++版本編譯 | 勤奮的小青蛙
CMake 關(guān)閉警告的方法
在CMakeLists.txt中添加add_definitions(-w)
應(yīng)用于單個target
if(CMAKE_COMPILER_IS_GNUCC)
target_compile_options(main PRIVATE"-Wall")
endif()
if(MSVC)
target_compile_options(main PRIVATE"/ W4")
endif()
應(yīng)用于所有target
if(CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_CXX_FLAGS"$ {CMAKE_CXX_FLAGS} -Wall")
endif()
if(MSVC)
set(CMAKE_CXX_FLAGS"$ {CMAKE_CXX_FLAGS} / W4")
endif()
注意:為GCC或/ WX添加-Werror以便MSVC將所有警告視為錯誤。這會將所有警告視為錯誤。這對于新項目來說可以方便地執(zhí)行嚴(yán)格的警告。
另外, -Wall 并不意味著"所有錯誤";從歷史意義上講,它意味著"每個人都可以達(dá)成一致的所有錯誤""。從 -Wall -Wextra 開始,然后仔細(xì)閱讀您的版本的GCC手冊,并找到 else 編譯器可以為您提供關(guān)于警告的信息。
CMake和編譯器警告 - IT屋-程序員軟件開發(fā)技術(shù)分享社區(qū)
關(guān)閉編譯器優(yōu)化
(未驗證)
1)add_compile_options(-fno-elide-constructors) #關(guān)閉編譯器優(yōu)化
2)set(CMAKE_CXX_FLAGS "-fno-elide-constructors ${CMAKE_CXX_FLAGS}")
Debug和Release 方案
About table
Configurations in terms of gcc/clang compilers (CMake 3.4.1):
Debug: -g
Release: -O3 -DNDEBUG
RelWithDebInfo: -O2 -g -DNDEBUG
MinSizeRel: -Os -DNDEBUG
It means:
+---------------+--------------+--------------+----------+
| | optimization | assert works | stripped |
+---------------+--------------+--------------+----------|
| Debug | no | yes | no |
| Release | full | no | yes |
| RelWithDebInfo| good | no | no |
| MinSizeRel | size | no | yes |
+---------------+--------------+--------------+----------+
So I don't agree with your MinSizeRel description because in this case I think both MinSizeRel and Release are stripped.
About question
As far as I understand you want no extra flags at all (no -g, -O* or -DNDEBUG). For Makefile-like generators:
> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=MyConf -DCMAKE_CXX_FLAGS_MYCONF=""
> cmake --build _builds
CMakeLists 實現(xiàn)動態(tài)宏開關(guān)
去掉編譯優(yōu)化
在CMakeList中添加:
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
set(CMAKE_CXX_FLAGS "-Wall -Wextra")
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
執(zhí)行的時候
cmake -DCMAKE_BUILD_TYPE=Release
也可以在上一層(調(diào)用本CMakeList.txt的)的CMakeList.txt中添加下面:
option (CMAKE_BUILD_TYPE "Use tutorial provided math implementation" ON)
表示啟用CMAKE_BUILD_TYPE 宏。
option (CMAKE_BUILD_TYPE "Use tutorial provided math implementation" OFF) #表示關(guān)
參考:
c++ - Optimize in CMake by default - Stack Overflow
debugging - How to compile without optimizations -O0 using CMake - Unix & Linux Stack Exchange
例子
最近在工作中需要通過一份C代碼控制邏輯走向,網(wǎng)上找了一下資料,發(fā)現(xiàn)可以通過在CMakeLists文件中動態(tài)定義宏開關(guān),從而能夠達(dá)到編譯出不同邏輯流的代碼。
具體步驟:
首先,我在src代碼里編寫了若干debug的輸出:
#IFDEF DEBUG
some print command;
#ENDIF
然后,在CMakeLists文件中添加DEBUG的定義:
IF (CMAKE_BUILD_TYPE STREQUAL DEBUG)
ADD_DEFINITIONS(-DDEBUG)
ENDIF()
最后,在cmake的時候設(shè)置參數(shù) -DCMAKE_BUILD_TYPE 為 DEBUG:
$ cmake .. -DCMAKE_BUILD_TYPE=DEBUG
$ make -j4
這樣再運行可執(zhí)行文件時就會打印出some print command的debug信息了。如果不想看到debug信息,只需在參數(shù)中不設(shè)置DEBUG參數(shù),或者將DEBUG參數(shù)設(shè)置為其它值即可(以下兩種方式二者選其一):
$ cmake ..
$ cmake .. -DCMAKE_BUILD_TYPE=RELEASE
到此 CMakeLists 實現(xiàn)動態(tài)宏開關(guān)介紹完成。
原文鏈接:https://blog.csdn.net/qq_19734597/article/details/104461963
CMake--List用法
CMake--List用法 - narjaja - 博客園
CmakeLists.txt單行注釋和多行注釋
單行注釋:使用“#”
多行注釋:使用“#[[ ]]”
————————————————
版權(quán)聲明:本文為CSDN博主「bandaoyu」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/bandaoyu/article/details/115165199
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。
DIY機械鍵盤相關(guān)社區(qū):機械鍵盤DIY