首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译

我这不就是典型的动态语言的思维吗,之前还写文章跟别人讲《如何避免用动态语言的思维写Go代码》......这次打自己脸打的实在有点疼。...需要注意的是,构建标签必须在代码文件里位于package声明的上方,并且后跟一个空行。 当Go编译一个包时,它会分析包内的每个源码文件并查找构建标签。标签决定了这个源码文件是否被编译。...,原因是go/build包会忽略所有文件名以.和_开始的文件。...使用构建标签还是文件名后缀 构建标签和文件名后缀在功能上是重叠的。比如,一个名为mypkg_linux.go的文件,再包含构建标签// +build linux会显得多余。...Go标准库中,尤其是runtime,syscall,os,net包中包含了大量这种例子。

2.8K30

透过一个编译报错,总结两个Go程序编译的重要知识

最近调研了一下某个做 APM 的厂商的 Go 探针程序,说是引入一个包,全程不用再修改其他代码就能在项目里引入探针。没想到在刚引入包试着构建了一下就翻车了。...就是这个包下没有能在当前构建环境下构建的 Go 文件。猜测应该是这个包源码的构建标签上声明了不允许在Mac 环境下构建。打开源码看了看,确实是,所有文件的构建标签都是这么声明的。...后缀的顺序记住不要颠倒,后缀中同时出现系统和架构名时,需要保持filename_GOOS_ 在 Go 的每个内置库里都有很多以不同系统名结尾的文件。...下面是Go的os内置库源代码的部分截图: 文件后缀添加编译约束 两种添加编译限制的方式该如何选择 构建标签和文件名后缀在功能上是重叠的。...,或者你需要排除某个特定平台时,我们选择构建标签的方式。

2.7K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    由一条编译报错信息,引出两个Go编译的重要知识

    最近调研了一下某个做 APM 的厂商的 Go 探针程序,说是引入一个包,全程不用再修改其他代码就能在项目里引入探针。没想到在刚引入包试着构建了一下就翻车了。...就是这个包下没有能在当前构建环境下构建的 Go 文件。猜测应该是这个包源码的构建标签上声明了不允许在Mac 环境下构建。打开源码看了看,确实是,所有文件的构建标签都是这么声明的。...后缀的顺序记住不要颠倒,后缀中同时出现系统和架构名时,需要保持$filename_$GOOS_$GOARCH.go的顺序。 在 Go 的每个内置库里都有很多以不同系统名结尾的文件。...下面是Go的os内置库源代码的部分截图: 文件后缀添加编译约束 两种添加编译限制的方式该如何选择 构建标签和文件名后缀在功能上是重叠的。...,或者你需要排除某个特定平台时,我们选择构建标签的方式。

    1K50

    golang条件编译

    开篇 golang中没有类似C语言中条件编译的写法,比如在C代码中可以使用如下语法做一些条件编译,结合宏定义来使用可以实现诸如按需编译release和debug版本代码的需求 #ifndef #define...go build在构建一个包的时候会读取这个包里的每个源文件并且分析编译便签,这些标签决定了这个源文件是否参与本次编译 编译标签添加的规则(附上原文): a build tag is evaluated...linux package mypkg // wrong 这个例子里的编译标签和包的声明之间没有用空行隔开,这样编译标签会被当做包声明的注释而不是编译标签从而被忽略掉 下面这个是正确的标签的书写方式,标签的结尾添加一个空行这样标签就不会当做其他声明的注释...这个方法通过改变文件名的后缀来提供条件编译,这种方案比编译标签要简单,go/build可以在不读取源文件的情况下就可以决定哪些文件不需要参与编译。...文件命名约定可以在go/build 包里找到详细的说明,简单来说如果你的源文件包含后缀:_GOOS.go,那么这个源文件只会在这个平台下编译,_GOARCH.go也是如此。

    1.4K30

    使用go build 进行条件编译 转

    里定义的tags和命名约定来让Go的包可以管理不同平台的代码 这篇文章将讲述Go的条件编译系统是如何实现的,并且通过实例来说明如何使用 1....第一种条件编译的方法:编译标签 在源代码里添加标注,通常称之为编译标签( build tag) 编译标签是在尽量靠近源代码文件顶部的地方用注释的方式添加 go build在构建一个包的时候会读取这个包里的每个源文件并且分析编译便签...,标签的结尾添加一个空行这样标签就不会当做其他声明的注释 // +build !...第二种条件编译方法:文件后缀 这个方法通过改变文件名的后缀来提供条件编译,这种方案比编译标签要简单,go/build可以在不读取源文件的情况下就可以决定哪些文件不需要参与编译 文件命名约定可以在go/build...编译标签和文件后缀的选择 编译标签和文件后缀的功能上有重叠,例如一个文件名:mypkg_linux.go包含了// +build linux将会出现冗余 通常情况下,如果源文件与平台或者cpu架构完全匹配

    2.4K40

    面向 C++ 的现代 CMake 教程(四)

    这绝对是节省时间的好方法,并且在增加检查数量时可以随时使用。与格式化一样,确保在将静态分析工具生成的任何更改引入遗留代码库时避免合并冲突。...在本章中,我们将介绍如何导出目标,以便另一个项目可以在不安装的情况下使用它们,以及如何安装我们的项目,以便它们可以很容易地被系统上的任何程序使用。...所有这些准备将为本章我们将要涵盖的最后方面铺平道路:使用 CPack 生成各种包管理器在不同操作系统中认识的归档文件、安装程序、捆绑包和包。这些可以用来携带预构建的工件、可执行文件和库。...在本章中,我们将涵盖以下主要主题: 无需安装导出 在系统上安装项目 创建可重用的包 定义组件 使用 CPack 打包 技术要求 您可以在 GitHub 上找到本章的代码文件...在我们构建项目之后,我们可以在构建树中运行cpack二进制文件来生成实际的包: cpack [] 从技术上讲,CPack 能够读取放置在当前工作目录中的所有配置文件选项,但你也可以选择从命令行覆盖这些设置

    68300

    在腾讯云CVM上使用Go语言编译软件

    源码构建后将会在$GOPATH/bin 查看到已经构建的软件,同时,GO语言也会自动配置到系统$PATH中,这时你就可以在系统任意位置使用软件的命令了。...这里我以编译安装Go语言编写的web服务器 Caddy为例,我们将使用go get命令获取在Github上面的Caddy软件包。...没有任何输出,则表明编译成功,由于我们设置了以Windows构建此文件,所以你将看到exe可执行文件,该文件 以.exe结尾。...当为Windows构建时,我们还需 要在文件名中添加.exe后缀。...结论 在本文中,您已经学习了如何使用Go语言从Git获取相关安装包,以为不同平台构建和交叉编译可执行文件。 感谢您的阅读!你学会了嘛?

    2.2K50

    CPack 入门指南

    [Cpack01.png] 背景 CPack 是 CMake 2.4.2 之后的一个内置工具,用于创建软件的二进制包和源代码包。 CPack 在整个 CMake 工具链的位置。...因为是 CMake 的内置工具,所以使用的方式也是通过在 CMakeLists.txt 配置参数,就能达到我们的需求。使用起来很方便,容易上手。...一个简单的例子 基础配置 这里介绍如何打包 rpm 包,deb 的打包是一样的,区别在于一些配置。...编译完成后,执行 cpack -G RPM 就可将文件打包成 rpm 包,当前目录下会生成一个 _CPack_Packages 目录和一个以 .rpm 为后缀名的文件 example-1.0.0-Linux.rpm...分装多个包 上述配置是将所有需要打包的文件打包成一个安装包,但一个项目往往会有多个不同服务,在实施部署时需安装到不同的机子上,这个时候如果把所有服务一起打包,会导致部署时包太大。

    2.6K51

    CMAKE入门实战

    0.导语 最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧,...CMake 会将当前目录所有源文件的文件名赋值给变量 DIR_SRCS ,再指示变量 DIR_SRCS 中的源文件需要编译成一个名称为 Demo 的可执行文件。...%d\n", argv[0], Demo_VERSION_MAJOR, Demo_VERSION_MINOR); 7.生成安装包 如何配置生成各种平台上的安装包...对应CMakeLists.txt如下: # 构建一个 CPack 安装包 include (InstallRequiredSystemLibraries) set (CPACK_RESOURCE_FILE_LICENSE...") set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}") include (CPack) 下面就是如何使用: 输入cpack .

    1.5K20

    万字总结编译利器CMake,从入门到项目实战演练

    最后我们包含了CPack这个模块来使用这些变量和你所使用的系统的其它特性来设置安装包。 接下来一步是用通常的方式构建工程,然后在CPack上运行它。...此设置将存储在缓存中,因此用户不必每次在构建目录上运行CMake时设置该值。 下一个更改是使构建和链接MathFunctions库成为布尔选项。...在MathFunctions子目录中,提供了一个名为MakeTable.cxx的新的源文件以生成表。 查看完文件后,我们可以看到该表是作为有效的C++代码生成的,并且输出文件名作为参数传入。...(第9步)混合静态和动态库 在本节中,我们将展示如何使用BUILD_SHARED_LIBS变量来控制add_library的默认行为,并允许控制如何构建没有显式类型(STATIC,SHARED,MODULE...解决方案是更新MathFunctionstarget_include_directories,以了解从构建目录和install/包中使用它时需要不同的INTERFACE位置。

    1.3K00

    Golang深入浅出之-Go语言项目构建工具:Makefile与go build

    在Go语言的开发过程中,项目构建是一个关键环节,它涉及代码编译、打包、测试等多个步骤。...一、go build:简单高效的命令行构建1.1 基本用法go build命令可以直接编译Go源代码文件,生成可执行文件。默认情况下,生成的可执行文件名为源文件去掉.go后缀的结果。...go build myapp.go1.2 常见问题与避免问题:依赖管理混乱,特别是没有使用Go Modules时。解决:确保项目使用Go Modules(go mod)管理依赖。...Makefile在大型项目、复杂构建流程或需要跨平台编译时更为灵活和强大。四、总结无论是使用go build还是Makefile,关键在于选择最适合项目需求的构建方式。...实践中,不妨从简单的go build开始,随着项目复杂度的增加,逐步引入Makefile以实现更高级的构建自动化。我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

    1.4K10

    Go 包概念及其机制详解&内置工具使用简介 【Go语言圣经笔记】

    在本书开始的时候,我们已经见识过如何使用工具箱自带的工具来下载、构建和运行我们的演示程序了。在本章,我们将看看这些工具的基本设计理论和尝试更多的功能,例如打印工作区中包的文档和查询相关的元数据等。...第二个例外,包所在的目录中可能有一些文件名是以_test.go为后缀的Go源文件(译注:前面必须有其它的字符,因为以_或.开头的源文件会被构建工具忽略),并且这些源文件声明的包名也是以_test为后缀名的...笔者总结如下: 如何命名包: 一般要用短小的包名,但也不能太短导致难以理解 尽可能让命名有描述性且无歧义 包名一般采用单数的形式,采用复数形式时,是为了避免和同名关键字冲突 要避免包名有其它的含义 如何命名包内成员...笔者注:*.go表示当前目录所有的以.go作为后缀名的文件,所有所有go文件都会运行,不推荐) 第一行的参数列表中,第一个不是以.go结尾的将作为可执行程序的参数运行。...例如,文件中可能包含下面的注释: // +build linux darwin 在包声明和包注释的前面,该构建注释参数告诉go build只在编译程序对应的目标操作系统是Linux或Mac OS X时才编译这个文件

    1.7K30

    使用 CMakePresets.json 简化 CMake 项目初始化繁杂步骤

    痛苦 本地开发需要输入参数太多 刚开始做纯 C++ 跨端的项目时,为了考虑项目的统一工程化管理选择使用 CMake + Conan,因为各平台下使用的工具链、 IDE 都不一样。...,对工程在不同设备上编译带来很大的挑战,非常容易编译出错。...要针对某个平台加一个配置时需要改多处位置,同样非常容易出错不易维护。 目标 经过多个项目跨平台编译构建的洗礼,很难忍受在切换项目过程中频繁的敲入命令去初始化 CMake 工程。...每个人使用的开发工具都各要求。特别是开源项目,如果没有提供一套全平台对各类工具都支持的配置文件,这会让开发者在工程配置上就被劝退。...所以我们期望对项目工程化改造的目标不仅仅是解决上面的痛苦问题,更期望能让开发人员在接手项目时不需要在编译工具链、工程配置上花费太多的心思,让主流的开发工具打开工程开箱即用。

    6.8K20

    Shell系统内置变量

    另外,当在一个 shell 中启动另一个 shell 的时候, SHELL 变量的值不会发生改变,而 BASH 变量的值会发生改变,指向新 shell 的路径。...shell 在执行 cd 命令时会从这些指定的目录列表中寻找要进入的目标路径。...FIGNORE 由冒号分隔的后缀名列表,在进行文件名补全时会忽略以这些后缀名结尾的文件名 GLOBIGNORE 它是由冒号分隔的模式列表,表示通配时忽略的文件名集合。...EXECIGNORE 它是由冒号分隔的模式列表,表示在 $PATH 中搜索命令时忽略的文件名集合。...TMPDIR 若设置了,则 bash 在该值所指定的目录下创建临时文件 其他 -- BASH_REMATCH 当使用 =~ 进行正则匹配时,该数组变量存储的是整体或个分组匹配的字符串位置,其中 ${BASH_REMATCH0

    1.6K00

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券