当前位置:首页 > 科技 > 正文

go语言入门教程pdf,go语言官方中文文档

go语言入门教程pdf,go语言官方中文文档

大家好,如果您还对go语言入门教程pdf不太了解,没有关系,今天就由本站为大家分享go语言入门教程pdf的知识,包括go语言官方中文文档的问题都会给大家分析到,还望可以...

大家好,如果您还对go语言入门教程pdf不太了解,没有关系,今天就由本站为大家分享go语言入门教程pdf的知识,包括go语言官方中文文档的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

怎么学好编程

1一、明确学习目的

学习编程对大多数IT业人员来说都是非常有用的。学编程,做一名编程人员,从个人角度讲,可以解决在软件使用中所遇到的问题,改进现有软件,可以为自己找到一份理想的工作添加重要得砝码,有利于在求职道路上谋得一个好的职位;从国家的角度,可以为中国的软件产业做出应有的贡献,一名优秀的程序员永远是被争夺的对象。学习编程还能锻炼思维,使我们的逻辑思维更加严密;能够不断享受到创新的乐趣,将一直有机会走在高科技的前沿,因为程序设计本身是一种创造性的工作。知识经济时代给我们带来了无限的机会,要想真正掌握计算机技术,并在IT行业里干出一番事业来,有所作为,具有一定的编程能力是一个基本条件和要求。

2二、打好基础

学编程要具备一定的基础,总结之有以下几方面:

1、数学基础从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的,最早的计算机也是为数值计算而设计的。因此,要学好计算机就要有一定的数学基础,出学者有高中水平就差不多了。

2、逻辑思维能力的培养学程序设计要有一定的逻辑思维能力,“逻思力”的培养要长时间的实践锻炼。要想成为一名优秀的程序员,最重要的是掌握编程思想。要做到这一点必须在反复的实践、观察、分析、比较、总结中逐渐地积累。因此在学习编程过程中,我们不必等到什么都完全明白了才去动手实践,只要明白了大概,就要敢于自己动手去体验。谁都有第一次。有些问题只有通过实践后才能明白,也只有实践才能把老师和书上的知识变成自己的,高手都是这样成材的。

3三、注意理解一些重要概念

一本程序设计的书看到的无非就是变量、函数、条件语句、循环语句等概念,但要真正能进行编程应用,需要深入理解这些概念,在理解的基础上应用,不要只简单地学习语法、结构,而要吃透针这些语法、结构的应用例子,做到举一反三,触类旁通。

4四、掌握编程思想

学习一门语言或开发工具,语法结构、功能调用是次要的,最主要是学习它的思想。关键是学一种思想,有了思想,那么我们就可以触类旁通。

5五、多实践、多交流

掌握编程思想必须在编程实际工作中去实践和体会。编程起步阶段要经常自己动手设计程序,具体设计时不要拘泥于固定的思维方式,遇到问题要多想几种解决的方案。这就要多交流,各人的思维方式不同、角度各异,各有高招,通过交流可不断吸收别人的长处,丰富编程实践,帮助自己提高水平。亲自动手进行程序设计是创造性思维应用的体现,也是培养逻辑思维的好方法。

6六、养成良好的编程习惯

编程入门不难,但入门后不断学习是十分重要的,相对来说较为漫长。在此期间要注意养成一些良好的编程习惯。编程风格的好坏很大程度影响程序质量。良好的编程风格可以使程序结构清晰合理,且使程序代码便于维护。如代码的缩进编排、变量命令规则的一致性、代码的注释等。

7七、上网学编程

在网上可以学到很多不同的编程思想、方法、经验和技巧,有大量的工具和作品及相关的辅导材料供下载。

8八、加强计算机理论知识的再学习

学编程是符合“理论→实践→再理论→再实践”的一个认识过程。一开始要具有一定的计算机理论基础知识,包括编程所需的数学基础知识,具备了入门的条件,就可以开始编程的实践,从实践中可以发现问题需要加强计算机理论知识的再学习。程序人人皆可编,但当你发现编到一定程度很难再提高的时候,就要回头来学习一些计算机科学和数学基础理论。学过之后,很多以前遇到的问题都会迎刃而解,使人有豁然开朗之感。因此在学习编程的过程中要不断地针对应用中的困惑和问题深入学习数据结构、算法、计算机原理、编译原理、操作系统原理、软件工程等计算机科学的理论基础和数理逻辑、代数系统、图论、离散数学等数学理论基础知识。这样经过不断的学习,再努力地实践,编程水平一定会不断提高到一个新高度。

英语阅读,有哪些入门书籍可以推荐

授人以鱼不如授人以渔,分享一个秘传小技巧,教你怎么查英文原版书的难易程度是否适合自己。

蓝思(Lexile)分级是美国教育科研机构专门帮助学生鉴定图书阅读难度的网站,以帮助美国的学生们能够找到适合自己阅读能力的书。

网站地址是这个TheLexile?FrameworkforReading,不行的话就百度也能出来

分级的单位是Lexile(一般简写为L),这个单位怎么来的呢?

就是读懂一本超级低幼读物,和读懂一本百科全书之间的差距,除以1000,得到这个单位,一个Lexile。

网站首页如下图:

点进去后,直接右上角就有搜索框

输入英文书的书名,点一下search

结果就出来了

以《小王子》为例,网站显示《小王子》的难度是710L

那么蓝思分级的数字和我们的能力怎么对应呢?

如下图:

高一就可以阅读650L到850L的书所以根据表格右边的年级,选择合适难度的书,

但数据是死的,人是活的。如果你读了之后发现对自己太难或者太简单,那就选难度更低或更高的书呗。

下面是我推荐的一些难度较低,又非常好看、评分很高的书,也会附上书中的一些句子,大家参考看看难度:

Charlotte'sWeb(680L)夏洛的网

这是我读完的第一本英文原版书一个非常感人的童话故事

1.Whenyourstomachisemptyandyourmindisfull,it'salwayshardtosleep.

2.Thequickestwaytospoilafriendshipistowakesomebodyupinthemorningbeforeheisready.

3.Lifeisalwaysarichandsteadytimewhenyouarewaitingforsomethingtohappen.

TheLittlePrince(710L)小王子

根本无需多介绍

Ifyouweretosaytothegrown-ups:"Isawabeautifulhousemadeofrosybrick,withgeraniumsinthewindowsanddovesontheroof,"theywouldnotbeabletogetanyideaofthathouseatall.Youwouldhavetosaytothem:"Isawahousethatcost$20,000."Thentheywouldexclaim:"Oh,whataprettyhousethatis!"

TheBookThief(730L)偷书贼

看完哭的稀里哗啦,泪如雨下

“他打动了我,每次都打动了我,这是他造成的唯一伤害,他踩住了我的心,让我哭泣”正像温柔的死神这样说鲁迪一样。

偷书贼,这样一本絮叨的故事,在他乡的孤馆里,摇曳的火车上,打动了我,让我泪流满面。

Beforetheywentintotheirrespectivehomes,Rudystoppedamomentandsaid,"Goodbye,Saumensch."Helaughed.

"Goodnight,bookthief."ItwasthefirsttimeLieselhadbeenbrandedwithhertitle,andshecouldn'thidethefactthatshelikeditverymcuh.Aswe'rebothaware,she'dstolenbookspreviously,butinlateOctober1941,itbecameofficial.Thatnight,LieselMemingertrulybecamethebookthief.

TheGiver(760L)赐予者

TheGiver,翻译为赐予者,这本200页不到的小书描述了一个乌托邦社会,但有一个人例外,他一个人承担了整个世界该有的记忆,他必须独自承受痛苦、恐惧、和孤单,而他也同时知道什麼是温暖、幸福和爱。这个人被称为thereceiverofmemory,也就是theGiver。

当12岁的男主角Jonas成为这个thereceiverofmemory的接班人后,他得到了他以前所不曾有过的经验,而当他知道愈多时,他愈发现这个世界的不合理,最后他选择了逃离……

Jonasfeltarippingsensationinsidehimself,thefeelingofterriblepainclawingitswayforwardtoemergeinacry.

Memoriesarenotjustaboutthepast,theydetermineourfuture.Ihadlearnedthatknowingofwhatsomethingis,isnotthesameasknowinghowsomethingfeel.Igotlost...togoodkindoflost.Havefaith,theGivertoldme.Faith,thatwasseeingbeyond.Hecomparedittothewind:somethingfeltbutnotseen.

Wonder(790L)

中途无数次哭成毛毛虫,虽然朋友早就警告过我这本书超催泪的。

美国作家R.J.帕拉秋创作的一部关于“勇敢”的少年小说,描绘了一个充满泪水、爱与希望的生命旅程,述说一个平凡的男孩如何接纳自己、勇敢长大的不凡故事。

IknowI’mnotanordinaryten-year-oldkid.Imean,sure,Idoordinarythings.Ieaticecream.Iridemybike.Iplayball.IhaveanXBox.Stufflikethatmakesmeordinary.Iguess.AndIfeelordinary.Inside.ButIknowordinarykidsdon’tmakeotherordinarykidsrunawayscreaminginplaygrounds.Iknowordinarykidsdon’tgetstaredatwherevertheygo.

CharlieandtheChocolateFactory(810L)查理和巧克力工厂

我不知道我这个年龄的人,再读这类的幻想文学是不是太过幼稚。

不过有一些例外,那些能在诙谐幽默语言中带给人心灵的洗濯的经典,无论对于哪个年龄段的人们,哪怕就是老到白发替代了黑发;光滑的皮肤被沟壑取代,也不会过时。

阅读时因为难得的流畅而对故事能更好地感受真好。

最让人惊喜的当然是地下的那个奇妙的巧克力世界我甚至发现了3D打印的雏形哈哈童话很美好。

Thethingtoremember,'GrandmaGeorginasaid,'isthatwhateverhappens,you'llstillhavethebarofchocolate.'Buttherewasoneotherthingthatthegrown-upsalsoknew,anditwasthis:thathoweversmallthechancemightbeofstrikinglucky,thechanceisthere.Thechancehadtobethere.

Mr.Wonka:"Don’tforgetwhathappenedtothemanwhosuddenlygoteverythinghewanted."

CharlieBucket:"Whathappened?"

Mr.Wonka:"Helivedhappilyeverafter.”

AThousandSplendidSuns(830L)灿烂千阳

悲伤像缺乏哀鸣和怒吼的河流。死没什么了不起,活着才是勇敢。

Jalil写给Mariam的信,Howlittlethosethingsmattertomenowafterallthelossalltheterriblethingsihaveseeninthecursedwar.战争的伤害毁灭,日复一日的家暴,庆幸她们拥有一千个太阳般热烈伟大的爱,获得救赎。

Inafewyears,thislittlegirlwillbeawomanwhowillmakesmalldemandsonlife,whowillneverburdenothers,whowillneverletonthatshetoohashadsorrows,disappointments,dreamsthathavebeenridiculed.

Awomanwhowillbelikearockinariverbed,enduringwithoutcomplaint,hergracenotsulliedbutshapedbytheturbulencethatwashesoverher.

TheKiteRunner(840L)追风筝的人

Foryou,athousandtimesover.

为你,千千万万遍。

Forme,Canadaisaplacetopursuemydreams.However,itisalsotheplacewhereIrealizedmyparentshaveaged.

Althoughitseemedtohavelittletodowiththebook,Istillfeltoutragedtoseesuchamanwhowassuccessfulandprestigousbackhomebecameaworkeratthegasstation.

ForAmirandhisBaba,theyhadnochoicebecausetheyhadtoescapefromthewar.However,Idonotunderstandhowcanthethousandsofimmigrantsgiveuptheirfamilies,friends,memoriesandsuccessestoaforeignplacewheretherearenofamiliesandfriends.

Theyhavetostartfromnothingandtheycanneverbesuccessfulagain.Mostofthemcannotfindajob.Iftheydid,itwouldbeawaiterorwaitressatarestuarant,oraworkerinasmallcompanypaidwithminimalwage.Theirintelligienceisburiedintheirhomeland,whichnooneinaforeigncountrywouldvalue.

TheHouseonMangoStreet(870L)芒果街上的小屋

《芒果街上的小屋》所记录的,是从女孩蜕变为女人的过程,是少女时代的最后一段光阴。作品的触角伸向生活的每个角落,妈妈,婶婶,一朵小云彩,一只小狗,一次小伤心,一点小悸动在少女澄澈的眼底,这些都打上了“家”和“回忆”的记号

SomedayIwillhaveabestfriendallmyown.OneIcantellmysecretsto.Onewhowillunderstandmyjokeswithoutmyhavingtoexplainthem.

UntilthenIamaredballoon,aballoontiedtoananchor.

Onedaywewerepassingahousethatlooked,inmymind,likehousesIhadseeninMexico.

Idon'tknowwhy.TherewasnothingaboutthehousethatlookedexactlylikethehousesIremembered.

I'mnotevensurewhyIthoughtit,butitseemedtofeelright.

HarryPotter系列(880L)

魔法词汇较多,可能会难一些

Tohavebeenlovedsodeeply,eventhoughthepersonwholovedusisgone,willgiveussomeprotectionforever.

Afterall,tothewell-organizedmind,deathisbutthenextgreatadventure.

PeterPan(920L)

童话都是大人写的。当我们长大后,带着一颗童心重读那些儿时听过的故事,才能越明白大人所讲的童话。

Everychildisaffectedthusthefirsttimeheistreatedunfairly…

Afteryouhavebeenunfairtohimhewillloveyouagain,buthewillneverafterwardsbequitethesameboy.

Nooneevergetsoverthefirstunfairness;nooneexceptPeter.

Heoftenmetit,buthealwaysforgotit.

Isupposethatwastherealdifferencebetweenhimandalltherest.

新人想学编程,如何入门

首先,你得选择学哪种语言,现在主流的有c,c++,c#,java,还有最近热门的python。c是学习高级语言的基础;C++主要用于编写大型软件核心代码和汇编一样,比较难学,不过学好了后,很有前途;C#主要用于编写一些系统软件,比如游戏引擎核心代码,编写比较简单,界面比较友好;ASP.NET主要是用C#语言编写开发网站(B/S架构)。java有J2SE\J2EE\J2ME\JSP。J2EE是用很广泛,主要偏向于企业应用软件和一些桌面系统(C/S架构),计算机平台;第二,J2ME,面向无限领域,主要用于开发手机一些软件,比如手机游戏。很有潜力的家伙,看看中国的手机用户就知道了;JSP主要也是开发网站。Python是人工智能必须的语言,想要追赶前沿,这是最优的选择。想要学好这些语言,还得报辅导班或者上网自学,我的动态里就有学习这些编程语言的网站,大多数都是免费的。

surface go使用技巧

纸笔墨砚,文房四宝向来是读书人的强力辅助。既能从中读到知识,亦能在上圈点标注,更能自由地创作。随着时代的进步,砚被工厂精细化,墨被并入笔中,桌面上只需留有纸跟笔就足够了。

但这远非终点,PDA和无线网络的诞生让无纸化成为可能,而发展到现在,以Surface为代表的二合一多形态平板电脑,更是超出以往的想象。

SurfaceGo主打移动轻办公,因此也特别适合学生使用。在课堂上使用配套的Surface专业键盘盖敲打下老师的重点,又或者在老师事先发布的PDF文档上用SurfacePen圈点都是那么方便自然。

SurfaceGo本体轻便小巧,屏幕达10英寸,只有522克的重量却极大减轻书包的负担。在这块尺寸恰到好处的PixelSense触控屏上,无论是浏览内容还是交互都是件愉悦的事情。

配合左右两侧的立体声双扬声器,一时间似乎觉得老师的声音变得悦耳,板书也精致起来。

如果只是上上网课或者记记笔记,那就太小看SurfaceGo啦。作为一台运行Windows10系统的设备,能做到的当然远不止这些,以往在传统电脑上的使用习惯都能在SurfaceGo上无缝沿袭下来。

例如颇为实用的分屏功能,就能一边听课一边记笔记,要知道Windows系统的分屏可以随意拖动窗口的位置和改变大小,对于时常需要应用多开的同学们非常友好。

作为一台微软自家的产品,SurfaceGo在软硬件的协作上自然会连接得更紧密。软件上使用OneNote可以在多设备间通过云端同步笔记,知识点跟着账号走,再也不怕把书本落在某处而无法复习啦。

而Surface专业键盘盖是SurfaceGo的得力搭档,一方面充当保护盖的作用,另一方面又兼具触控板和键盘,使用上与传统笔记本无异,薄薄的收纳起来也很方便。

两者通过磁吸金属触点连接,不必担心充电的烦恼,稳定又稳固。

SurfacePen则是SurfaceGo的另一个得力搭档。拥有4096级压感的它,无论是专业绘图设计还是做做随堂笔记,都能准确还原笔记。

同样是通过磁力吸附在机身左侧,闲置时轻轻一吸就行了。值得一提的是,SurfacePen使用9号干电池供电,所以也不用担心每天为它充电了。

很难去定义SurfaceGo是一款怎样的产品,它可以随着你的使用而去做出形态上的改变。当把专业键盘盖取下时,摇身一变成为“一本书”,随时翻阅着遗忘曲线上的知识点。

而把SurfacePen和专业键盘盖都吸附上时,轻薄小巧的机身又能让你随意穿梭在校园各处。这样的SurfaceGo,可盐可甜,有谁不爱呢?

Cmake如何入门

WhyCMake?

先回答括号中的问题:被逼的。

这三个字是认真的。

不管CMake是否是一个优秀的构建工具,不管你是否认同CMake,都无法否认CMake目前是C++的defactobuildsystem[1]。

所以在社区以及生态的影响下,使用CMake作为构建工具的项目会越来越多。

一个佐证是,即使是微软、Google以及Facebook这三家公司都有自己的C++构建系统,他们开源的项目仍支持使用CMake构建;并且CMake是除了官方构建系统之外的推荐构建系统。

如何学习CMake

首先反对认为CMake不需要入门的观点:

cmake还需要入门?这种工具性质的东西,你只要用到哪里学到哪里就行了,如果需要入门那就说明这个工具做的不怎么样。

这句话后半句是符合事实的,CMake这个工具不仅是做的不怎么样,而且做的....一言难尽....以至于这个问题下就有回答说不要跳CMake这个坑的;更多的吐槽可以参考如何评价CMake这个问题。

所以自CMakev3.0开始(严格的来说是v3.2[2]),社区开始了浩浩荡荡的ModernCMake的运动,试图通过引入一些新的特性并搭配推荐做法来提升用户的生活质量。

嗯,另一个广泛喊着modernization的社区刚好是C++社区...

又恰好这俩的现代化用法的相同之处在于需要摒弃老的、传统的观念&使用方法,使用新的、现代化的惯用法。

打一个可能不太准的比喻:说CMake用到哪学到哪就行了和说C++用到哪学到哪就行了一样;如果你本身对这块领域已经很有经验,那么这样做是没问题的;但是对于一个新人来说,无异于让他自己去踩雷。

另一个上来就直接扔给对方一个CMakedocumentation让他学的做法也是非常糟糕的;这就好比一个新手说要学习C++,你直接朝他扔了cppreference...

学习(Modern)CMake的合适路径

0x00起手式

这里假设题主以及其他想入门CMake的人像我一样鶸,下面是我个人总结的比较适合的学习路径。

首先默念三遍并记住口诀:

Declareatarget

Declaretarget'straits

It'sallaboutt

然后clonehttps://github.com/ttroy50/cmake-examples这个项目到本地,把里面的

01-basic(跳过E-installing,因为和依赖有关,后面会说)

02-sub-projects

两个目录认真的学习一遍,最好自己能够动手跟着做一遍。

每学习完一个小节,把前面的三句口诀复习一下

每遇到一个不认识的命令,在EffectiveModernCMake这个页面里搜索一下,看看这个命令是否取代了某个老命令。

cmake-examples这个项目大概是我在Github上能找到的最符合“深入浅出”这四个字的。不仅例子符合ModernCMake,并且每个步骤都会有详细的注释来解释“是什么,为什么”。

例如第一节的HelloCMake,只有短短的几行:

#SettheminimumversionofCMakethatcanbeused

#Tofindthecmakeversionrun

#$cmake--version

cmake_minimum_required(VERSION3.5)

#Settheprojectname

project(hello_cmake)

#Addanexecutable

add_executable(hello_cmakemain.cpp)

而StaticLibrary一节,也只包含了最核心的内容:

cmake_minimum_required(VERSION3.5)

project(hello_library)

############################################################

#Createalibrary

############################################################

#Generatethestaticlibraryfromthelibrarysources

add_library(hello_librarySTATIC

src/Hello.cpp

)

target_include_directories(hello_library

PUBLIC

${PROJECT_SOURCE_DIR}/include

)

############################################################

#Createanexecutable

############################################################

#Addanexecutablewiththeabovesources

add_executable(hello_binary

src/main.cpp

)

#linkthenewhello_librarytargetwiththehello_binarytarget

target_link_libraries(hello_binary

PRIVATE

hello_library

)

考虑到我给这个项目也提过PR,这里也算有私心吧XD。

而之所以先看01和02是因为这两个目录里的内容已经涵盖了至少80%的使用场景;一下学太多很容易出现遭遇知识洪水的无力感而早早放弃。

对于入门学习来说,知识是螺旋上升的;同时照着优秀的例子learningbydoing可以很好缓解恐惧感。这里算是给蓝色的回答提供教材。

EffectiveModernCMake这里的作用类似于C++那几本Effective。

0x01紧跟步伐&拓展

前面讲过,CMake目前正处于现代化运动当中,新版本的迭代也非常快(最新版已经是v3.16了,并且已经内建支持了PCH),因此有一些之前认为是modernpractice的做法可能在后续的版本已经显得不那么好了。(别紧张,前面说过知识是螺旋式上升的)

所以如果你还想在这个方面有所深入,最好的方式就看各种会议的talk,包括他们的slides。

这里个人比较推荐的几个有:

EffectiveCMake:arandomseletionofbestpractices--DanielPfeifer

EmbracingModernCMake:HowtorecognizeandusemodernCMakeinterfaces--StephenKellyATDublinC++Meetup

ModernCMakeformodulardesign--MathieuRopertATCppCon-2017

MoreModernCMake:WorkingWithCMake3.12AndLater--DenizBahadirATMeetingC++2018

对应的slides和演讲的视频都可以搜到。

建议:不要试图一次全看懂,遇到不理解或者不认可的可以先跳过

如果你发现上面的几个slides的推荐做法有冲突也别紧张,说不定就是moremodern对modern的一次修正呢。

这里顺带举个例子来说明一下moderncmake发展的有多快。

因为CMake的变量很容易泄露到其他作用域去,所以ModernCMake有一个惯用法就是AvoidUnnecessaryVariables。对于项目的源文件,不依赖变量直接加到target上,同时可以通过generatorexpression设置不同平台的文件:

add_executable(hello_cmakemain.cpp)

target_source(hello_cmake

PRIVATE

foo.h

foo.cpp

lt;lt;BOOL:${WIN32}>:

#forWindows

>

lt;lt;NOT:lt;BOOL:${WIN32}>>:

#forPOSIX

>

)

在v3.11之前,add_xxx()定义一个target时,一定要有一个文件(sourceparameter),但是自v3.11开始这个约束被去掉了。所有源码文件可以通过target_source()引入,避免出现创建library时有一个源码文件孤零零的放在add_library()中显得很不协调。

0x02第三方依赖引入

如何引入&管理第三方依赖是一个时常能够在C++社区引发广泛讨论的话题。

众所周知,迄今为止C++至少有89种构建系统以及至少64种依赖管理方案,这还是建立在连module都没有情况下。

ModernCMake下引入第三方依赖目前整体上主要有两种方式。

第一种是Install&FindPackage

安装可以有多种途径,包括不仅限于:Linux系统的各包管理器;vcpkg或者conan这样单独包管理器;甚至自己cmakebuild&install。

安装好第三方库之后就可以在CMake种使用find_package()引入依赖。

好处是,CMake编写方便,以及可以使用不支持CMake的第三方库

但是这种方式的缺点也很明显:操作复杂度和二进制模块的ABI问题。

注:headeronly的库也可以安装,但是不影响以下讨论。

操作复杂度:

使用系统包管理器安装的库版本都比较老,想要新的且指定版本的库需要费工夫

vcpkg不支持库版本指定,一不小心所有依赖都更新了;想一想没有gomod甚至没有vendor机制前的gopackage

conan倒是支持版本控制,库更新的也勤快,并且可以针对项目单独指定依赖;但是库少是真的,并且对CMake使用上是侵入式的

另外一个蛋疼的是ABI。如果你安装的依赖库是希望被不同的项目直接使用,那么你迟早会掉到这个坑里。

在Windows上使用MSVC作为编译器的话,闭着眼睛都能发现:

Debug和Releasebuild是无法兼容链接在一起的

/MT和/MD是无法链接在一起的

X86和X64是无法链接在一起的

甚至有时候不同minor版本的构建也是无法链接在一起的(官方保证ABI但是帮同事解决链接问题时又遇到)

那么请问你应该安装的二进制是哪个配伍的呢?

Linux上坑稍微少一点,但是如果库作者自己不注意,或者安装的时候flags手抖了,也容易出现问题。

哦,注意你的GCC是不是开了CXX_11_ABI....

当然你也可以像vcpkg一样把允许所有的组合下二进制都构建安装一遍...

但是这里还有一个坑:多个ABI版本的二进制库如果要共存,需要库作者仔细谨慎的编写Install模块!

前面推荐的slides里有不少关于如何正确编写Export&Install的内容;以及,你现在可以把cmake-examples里的例子看完了:-)。

如果依赖不怎么经常变化的话,通过dockerimage把第三方包都装好,感觉上可能会比较省事?

第二种方式是源码依赖。

源码依赖的意思是说,你可以访问依赖的完整源代码,因此构建的时候是第三方依赖先构建,然后再构建你的工程。

注意,源码依赖模式下,第三方依赖一样也可以是静态库、动态库。

优点是,你可以精细控制整个构建过程;因为工具链&参数是统一的,所以没有ABI的问题。

缺点有如下几个:

构建时间长,因为第三方依赖也要构建;同时不同的项目如果依赖同一个库,需要分别构建。

需要依赖库支持CMake,或者有人为依赖库提供好CMake工程描述

源码依赖在CMake中通过add_subdirectory()添加依赖源码文件夹实现。

也可以通过ExternalProjectAdd以及v3.11开始提供的FetchContentModule来完成自动化。

Google是源码依赖的拥趸,他们开源的abseil-cpp、grpc-cpp等都推荐使用源码依赖的方式进行构建。

研究过Chromium的人想必这辈子都忘不了depot_tools和gclient....

这里单独提一下FetchContentModule。

这个模块是v3.11开始有的,并且在v3.14得到了进一步完善。它的核心功能是帮你从指定的VCS地址(比如gitrepo,SVNrepo)或者URL下载依赖,并自动通过add_subdirectory()进入你的工程。

并且这一切发生在configurationstage。

grpc-cpp的官方文档就提供了使用FetchContent来引入的例子:

include(FetchContent)

FetchContent_Declare(

gRPC

GIT_REPOSITORYhttps://github.com/grpc/grpc

GIT_TAGv1.25.0

)

FetchContent_MakeAvailable(gRPC)

add_executable(my_exemy_exe.cc)

target_link_libraries(my_exegrpc++)

如果你决定使用FetchContent,不妨考虑一下CPM这个CMake扩展。

CPM在FetchContent和传统的Packagedependency的基础之上做了很多整合,支持:

指定一个全局的三方源码依赖缓存文件夹,避免多个项目重复拉取同一个版本的依赖源码

通过参数fallback到find_package()的方式使用localpackage。

依赖的options控制

最后,希望能在有生之年看到defactopackagemanager出现的那天。。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

最新文章