欢迎来到皮皮网网首页

【手机开发平台源码】【体感拍照 源码】【文艺网盘源码】discuss论坛源码_论坛源码最好用的

来源:网站源码打开很慢 时间:2024-11-24 23:39:03

1.2019秋招|菜鸟C++工程师秋招面经分享(上)
2.如何使用bazel build

discuss论坛源码_论坛源码最好用的坛源坛源

2019秋招|菜鸟C++工程师秋招面经分享(上)

       作者:匿名

       链接:/discuss/

       来源:牛客网

       我在秋招中作为菜鸟级C++工程师经历了不少坎坷,最终拿到了4个小厂的码论码最offer,大厂的好用面试统统没过。这段经历让我深刻反思,坛源坛源手机开发平台源码意识到早起早学的码论码最重要性。我选择从6月拿了一个vivo提前批的好用sp开始,之后主要瞄准互联网公司,坛源坛源幸运地拿到了两个互联网公司的码论码最offer。

       现在,好用我愿意分享我的坛源坛源经验,希望对未来的码论码最体感拍照 源码牛友们有所启发。面试过程中,好用主要考察了以下几个方面:

       C++基础

       我参考了《Effective C++》、坛源坛源《C++ Prime》、码论码最《STL源码剖析》等书籍,好用深入理解了宏定义、文艺网盘源码inline函数、字符串替换等概念。

       数据结构与算法

       《大话数据结构》、《数据结构浙大版》、《算法设计与分析》等书为我提供了理论基础,源码 apk漏洞检测而《算法导论》、《剑指offer》、《LeetCode》、《组合数学》等则帮助我实践和掌握算法技巧。

       网络技术

       从TCP/IP到UDP和TCP编程,英雄岛online源码我了解了服务器和客户端的步骤和规范,熟悉了网络编程的底层逻辑。

       操作系统

       我学习了死锁的四个条件、避免与预防方法以及解除死锁的策略。

       以上是我面试准备的重点内容。希望我的分享能够帮助你更好地准备面试,提升自己的竞争力。记得,多练习,多总结,坚持学习,你会在求职路上越走越远。记住,不经历秋招的你,不知道自己的潜力有多大。如果你有志于成为一名成功的程序员,那么现在就开始努力吧!

如何使用bazel build

       å®‰è£…

       å®‰è£…过程请参考: /example

       $ cat > src/main/java/com/example/ProjectRunner.java <<EOF

       package com.example;

       public class ProjectRunner {

       public static void main(String args[]) {

       Greeting.sayHi();

       }

       }

       EOF

       $ cat > src/main/java/com/example/Greeting.java <<EOF

       package com.example;

       public class Greeting {

       public static void sayHi() {

       System.out.println("Hi!");

       }

       }

       EOF

       Bazel通过工作区中所有名为 BUILD 的文件来解析需要构建的项目信息,因此,我们需要先在 ~/gitroot/my-project 目录创建一个 BUILD 构建文件。下面是BUILD构建文件的内容:

       # ~/gitroot/my-project/BUILD

       java_binary(

       name = "my-runner",

       srcs = glob(["**/*.java"]),

       main_class = "com.example.ProjectRunner",

       )

       BUILD文件采用类似Python的语法。虽然不能包含任意的Python语法,但是BUILD文件中的每个构建规则看起来都象是一个Python函数调用,而且你也可以用 "#" 开头来添加单行注释。

       java_binary 是一个构建规则。其中 name 对应一个构建目标的标识符,可用用它来向Bazel指定构建哪个项目。srcs 对应一个源文件列表,Bazel需要将这些源文件编译为二进制文件。其中 glob(["**/*.java"]) 表示递归包含每个子目录中以每个 .java 为后缀名的文件。com.example.ProjectRunner 指定包含main方法的类。

       çŽ°åœ¨å¯ä»¥ç”¨ä¸‹é¢çš„命令构建这个Java程序了:

       $ cd ~/gitroot/my-project

       $ bazel build //:my-runner

       INFO: Found 1 target...

       Target //:my-runner up-to-date:

       bazel-bin/my-runner.jar

       bazel-bin/my-runner

       INFO: Elapsed time: 1.s, Critical Path: 0.s

       $ bazel-bin/my-runner

       Hi!

       æ­å–œï¼Œä½ å·²ç»æˆåŠŸæž„建了第一个Bazel项目了!

       æ·»åŠ ä¾èµ–关系

       å¯¹äºŽå°é¡¹ç›®åˆ›å»ºä¸€ä¸ªè§„则是可以的,但是随着项目的变大,则需要分别构建项目的不同的部件,最终再组装成产品。这种构建方式可以避免因为局部细小的修改儿导致重现构建整个应用,同时不同的构建步骤可以很好地并发执行以提高构建效率。

       æˆ‘们现在将一个项目拆分为两个部分独立构建,同时设置它们之间的依赖关系。基于上面的例子,我们重写了BUILD构建文件:

       java_binary(

       name = "my-other-runner",

       srcs = ["src/main/java/com/example/ProjectRunner.java"],

       main_class = "com.example.ProjectRunner",

       deps = [":greeter"],

       )

       java_library(

       name = "greeter",

       srcs = ["src/main/java/com/example/Greeting.java"],

       )

       è™½ç„¶æºæ–‡ä»¶æ˜¯ä¸€æ ·çš„,但是现在Bazel将采用不同的方式来构建:首先是构建 greeter库,然后是构建 my-other-runner。可以在构建成功后立刻运行 //:my-other-runner:

       $ bazel run //:my-other-runner

       INFO: Found 1 target...

       Target //:my-other-runner up-to-date:

       bazel-bin/my-other-runner.jar

       bazel-bin/my-other-runner

       INFO: Elapsed time: 2.s, Critical Path: 1.s

       INFO: Running command line: bazel-bin/my-other-runner

       Hi!

       çŽ°åœ¨å¦‚果你改动ProjectRunner.java代码并重新构建my-other-runner目标,Greeting.java文件因为没有变化而不会重现编译。

       ä½¿ç”¨å¤šä¸ªåŒ…(Packages)

       å¯¹äºŽæ›´å¤§çš„项目,我们通常需要将它们拆分到多个目录中。你可以用类似//path/to/directory:target-name的名字引用在其他BUILD文件定义的目标。假设src/main/java/com/example/有一个cmdline/子目录,包含下面的文件:

       $ mkdir -p src/main/java/com/example/cmdline

       $ cat > src/main/java/com/example/cmdline/Runner.java <<EOF

       package com.example.cmdline;

       import com.example.Greeting;

       public class Runner {

       public static void main(String args[]) {

       Greeting.sayHi();

       }

       }

       EOF

       Runner.java依赖com.example.Greeting,因此我们需要在src/main/java/com/example/cmdline/BUILD构建文件中添加相应的依赖规则:

       # ~/gitroot/my-project/src/main/java/com/example/cmdline/BUILD

       java_binary(

       name = "runner",

       srcs = ["Runner.java"],

       main_class = "com.example.cmdline.Runner",

       deps = ["//:greeter"]

       )

       ç„¶è€Œï¼Œé»˜è®¤æƒ…况下构建目标都是 私有 的。也就是说,我们只能在同一个BUILD文件中被引用。这可以避免将很多实现的细节暴漏给公共的接口,但是也意味着我们需要手工允许runner所依赖的//:greeter目标。就是类似下面这个在构建runner目标时遇到的错误:

       $ bazel build //src/main/java/com/example/cmdline:runner

       ERROR: /home/user/gitroot/my-project/src/main/java/com/example/cmdline/BUILD:2:1:

       Target '//:greeter' is not visible from target '//src/main/java/com/example/cmdline:runner'.

       Check the visibility declaration of the former target if you think the dependency is legitimate.

       ERROR: Analysis of target '//src/main/java/com/example/cmdline:runner' failed; build aborted.

       INFO: Elapsed time: 0.s

       å¯ç”¨é€šè¿‡åœ¨BUILD文件增加visibility = level属性来改变目标的可间范围。下面是通过在~/gitroot/my-project/BUILD文件增加可见规则,来改变greeter目标的可见范围:

       java_library(

       name = "greeter",

       srcs = ["src/main/java/com/example/Greeting.java"],

       visibility = ["//src/main/java/com/example/cmdline:__pkg__"],

       )

       è¿™ä¸ªè§„则表示//:greeter目标对于//src/main/java/com/example/cmdline包是可见的。现在我们可以重新构建runner目标程序:

       $ bazel run //src/main/java/com/example/cmdline:runner

       INFO: Found 1 target...

       Target //src/main/java/com/example/cmdline:runner up-to-date:

       bazel-bin/src/main/java/com/example/cmdline/runner.jar

       bazel-bin/src/main/java/com/example/cmdline/runner

       INFO: Elapsed time: 1.s, Critical Path: 0.s

       INFO: Running command line: bazel-bin/src/main/java/com/example/cmdline/runner

       Hi!

       å‚考文档 中有可见性配置说明。

       éƒ¨ç½²

       å¦‚果你查看 bazel-bin/src/main/java/com/example/cmdline/runner.jar 的内容,可以看到里面只包含了Runner.class,并没有保护所依赖的Greeting.class:

       $ jar tf bazel-bin/src/main/java/com/example/cmdline/runner.jar

       META-INF/

       META-INF/MANIFEST.MF

       com/

       com/example/

       com/example/cmdline/

       com/example/cmdline/Runner.class

       è¿™åªèƒ½åœ¨æœ¬æœºæ­£å¸¸å·¥ä½œï¼ˆå› ä¸ºBazel的runner脚本已经将greeter jar添加到了classpath),但是如果将runner.jar单独复制到另一台机器上讲不能正常运行。如果想要构建可用于部署发布的自包含所有依赖的目标,可以构建runner_deploy.jar目标(类似<target-name>_deploy.jar以_deploy为后缀的名字对应可部署目标)。

       $ bazel build //src/main/java/com/example/cmdline:runner_deploy.jar

       INFO: Found 1 target...

       Target //src/main/java/com/example/cmdline:runner_deploy.jar up-to-date:

       bazel-bin/src/main/java/com/example/cmdline/runner_deploy.jar

       INFO: Elapsed time: 1.s, Critical Path: 0.s

       runner_deploy.jar中将包含全部的依赖。

       ä¸‹ä¸€æ­¥

       çŽ°åœ¨ï¼Œæ‚¨å¯ä»¥åˆ›å»ºè‡ªå·±çš„目标并组装最终产品了。接下来,可查看 相关教程 分别学习如何用Bazel构建一个服务器、Android和iOS应用。也可以参考 用户手册获得更多的信息。如果有问题的话,可以到 bazel-discuss 论坛提问。