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

编译proj-sys crate时如何设置C包含路径?

在编译proj-sys crate时设置C包含路径的方法如下:

  1. 首先,了解proj-sys crate是一个什么东西。proj-sys crate是一个用于与地理空间数据处理引擎PROJ交互的Rust语言库。它提供了与PROJ库进行交互所需的底层绑定和功能。
  2. 确定所需的C包含路径。在编译proj-sys crate之前,需要知道PROJ库的安装路径或包含头文件的路径。
  3. 使用Cargo构建系统配置C包含路径。在proj-sys crate的Cargo.toml文件中,可以使用build.rs文件来配置构建过程。
  4. 在Cargo.toml文件中添加build-dependencies。在Cargo.toml文件中,可以添加一个build-dependencies节来指定依赖的构建过程。例如:
代码语言:txt
复制
[build-dependencies]
cc = "1.0"

上述代码指定了一个名为cc的构建依赖项,用于在构建过程中调用C编译器。

  1. 创建build.rs文件。在项目的根目录下创建一个名为build.rs的文件,并添加以下代码:
代码语言:txt
复制
extern crate cc;

fn main() {
    cc::Build::new()
        .include("/path/to/proj/include") // 替换为PROJ库的头文件路径
        .file("src/foo.c") // 如果有需要,可以添加C源文件
        .compile("foo");
}

上述代码使用cc crate来配置构建过程。.include()方法指定了PROJ库的头文件路径,可以根据实际情况进行替换。如果需要,可以使用.file()方法添加C源文件。

  1. 运行构建过程。使用Cargo构建命令运行构建过程:
代码语言:txt
复制
cargo build

Cargo将在构建过程中执行build.rs文件中的代码,并根据设置的C包含路径进行编译。

总结:在编译proj-sys crate时,可以通过配置build.rs文件和使用cc crate来设置C包含路径。通过指定PROJ库的头文件路径,可以确保proj-sys crate正确地与PROJ库进行交互。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Rust crate与模块

我们还将涵盖其他与 Rust crate 的结构和分发有关的主题,包括如何记录与测试 Rust 代码、如何消除不必要的编译器警告、如何使用 Cargo 管理项目依赖项和版本控制、如何在 Rust 的公共...Cargo 清单讲述了如何使用这些信息。运行 cargo build 时,Cargo 首先会从 crates.io 下载这些 crate 的指定版本的源代码。...编译库时,Cargo 会使用 --crate-type lib 选项。...rlib 文件中还包含此 crate 的公共内联函数、泛型和宏这三者的副本,在 Rust 知道我们将如何使用它们之前,这些特性无法完全编译为机器码。...我们会展示如何嵌套模块并在需要时将它们分散到不同的文件和目录中。 我们会解释 Rust 使用的路径语法,以引用来自其他模块的语法项,并展示如何导入这些语法项,以便你使用它们而不必写出其完整路径。

23510

【投稿】如何制作一个*-sys的crate

这样别的 Rust 程序员就不必为了使用 C 库而重新发明 build script 了。 如何做一个 sys crate: 读 Cargo build script 文档。...取而代之,将配置用的 config 头文件输出到 OUT_DIR 并将输出目录设置到 include 路径中。 正方: cc crate 能处理与 Cargo 的集成,甚至是交叉编译。...头文件为包含 extern "C" {} 声明的 Rust 模块。...包含了代码和 C++ 模板的宏,就只能后端转译了(例如:macro → fn),或者封装在你 crate 的 C 函数内,并编译成一个私有静态类库。...如果你用其他法子在磁盘上搜索类库,同样得注意主机系统可能和编译目标并不兼容。 链接时的 surprise 尽量在你 sys crate 的 lib.rs 中多编写针对 C 符号的测试吧。

1.4K40
  • 【Rust学习】14_定义模块来控制作用域与私有性

    内容模块速查表在了解模块和路径的详细信息之前,我们在这里提供了有关模块、路径、use 关键字和 pub 关键字在编译器中如何工作,以及大多数开发人员如何组织代码的快速参考。...从 crate 根开始:编译 crate 时,编译器首先在 crate 根文件中查找代码(通常为 src/lib.rs 用于库 crate,src/main.rs 用于二进制 crate)以查找要编译的代码...mod.rs 中模块中代码的路径:一旦模块成为 crate 的一部分,只要隐私规则允许,你就可以使用代码的路径从同一 crate 中的其他任何位置引用该模块中的代码。...vegetables.rs ├── garden.rs └── main.rs在本例中,crate 根文件是 src/main.rs,它包含:use crate::garden::vegetables...;}pub mod garden; 行告诉编译器包含它在 src/garden.rs 中找到的代码,即:pub mod vegetables;这里,pub mod vegetables;意味着 src/

    10610

    听GPT 讲Rust源代码--compiler(31)

    CratePaths: 这个结构体包含了crate的路径信息,主要用于描述crate在文件系统中的存放位置。...CrateRejections: 这个结构体包含了加载crate时遇到的错误列表。它会记录所有加载失败的crate,并提供相关的错误信息。...CrateError: 这个枚举表示加载crate时可能出现的错误类型。其中包含了文件系统错误、crate版本错误等。...依赖关系格式是指在Rust编译器中如何存储和管理对其他库或模块的依赖关系。Rust编译器在编译源代码时需要了解这些依赖关系,以正确地解析和构建代码。...它包含模块的名称、路径、类型(比如C语言、C++语言)、是否是动态链接库、模块中的函数及其签名等相关信息。

    9510

    听GPT 讲Rust Cargo源代码(4)

    这些字段包含了与编译相关的信息,如配置信息、构建配置、源文件路径映射、待编译的包列表、目标文件等。...set_output_path: 设置编译输出物的路径。 get_output_path: 获取编译输出物的路径。 add_dep: 添加一个依赖关系到编译输出物。...Rlib: 表示生成的crate是一个静态链接库,该库只可供Rust的编译器使用。 Cdylib: 表示生成的crate是一个C-compatible的动态链接库,可以被其他编程语言调用。...这些crate类型包括二进制程序、动态链接库、静态链接库、Rust的静态链接库和C-compatible的动态链接库等。...Cargo在构建项目时,将项目划分为一个个编译单元,每个编译单元都是一个独立的模块或crate。编译单元之间可能存在依赖关系,即某个编译单元依赖于其他编译单元。

    10710

    听GPT 讲Rust源代码--compiler(36)

    CannotEnableCrtStaticLinux:表示无法启用静态C运行时库的Linux平台错误。 SanitizerCfiRequiresLto:表示地址空间分析器CFI需要使用链接时优化。...CompilerIO结构体:用于进行编译器输入和输出相关的配置,例如编译器日志文件、输出文件的路径等设置。...SearchPath结构体代表一个搜索路径,用于查找crate依赖项。它包含了一个路径和一个路径类型,用于确定搜索路径的种类。...PathKind包含了以下几个变体: Native:表示一个本地路径。 Crate(包括Normal和Remove):表示一个crate的路径。...ModulePathSuccess结构体的作用是在模块路径解析成功时返回相应的成功结果,它包含了解析成功后的模块路径信息。

    11710

    Rust 开发命令行工具(中)

    一个包会包含有一个 Cargo.toml 文件,阐述如何去构建这些 crate。 crate 是一个「二进制项或者库」。...crate root 是一个「源文件」,Rust 编译器以它为起始点,并构成你的 crate 的根模块。 ❝包中所包含的内容由几条规则来确立。...它们只在开发crate时需要,而在使用crate时不需要。...默认情况下,它会下载crate,编译其中包含的所有二进制目标(以release模式进行,所以可能需要一些时间),并将它们复制到~/.cargo/bin/目录中。...另一种方法是使用包含构建二进制文件所需工具的预构建(Docker)映像。这允许我们轻松地针对更多的异构平台进行定位。trust[7]项目包含可以包含在我们的项目中的脚本以及设置的说明。

    36020

    Rust + Android 的集成开发设计

    当第三方 crate 可能对广泛的社区更有益时,我们的目标是将 crate 优先引入。...同样地,当为 Android 开发的 crate 能够使广泛的 Rust 社区更为受益时,我们希望将其作为独立的库发布。...通常用于设置生成环境,或者使用其它语言的构建库(例如 C/C++),类似于配置使用其它语言的脚本。 避开 build.rs 脚本,从某种程度上说,也是不依赖于 Cargo。...源码生成 crate 与 C/C++ 编译器不同,rustc 只接受代表二进制或库入口点的单个源文件。它希望源码树的结构能够自动发现所有必需的源文件。...在构建时,cargo 命令会设置一个 OUT_DIR 环境变量,build.rs 脚本需要将生成的源代码放入该环境变量中。然后可通过以下方式包含该源文件: include!(concat!(env!

    2.2K10

    Rust模块系统

    包和 crate 2.1 crate crate 是一个二进制项或者库。crate root 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块。...一个包会包含有一个 Cargo.toml 文件,阐述如何去构建这些 crate。 一个包中至多只能包含一个库 crate(library crate)。...包中可以包含任意多个二进制 crate(binary crate)。 包中至少包含一个 crate,无论是库的还是二进制的。...通过将文件放在 src/bin 目录下,一个包可以拥有多个二进制 crate,每个 src/bin 下的文件都会被编译成一个独立的二进制 crate。 3....使用 use 引入结构体、枚举和其他项时,习惯直接引入它们的完整路径。 当需要引入很多定义于相同包或相同模块的项时,为每一项单独列出一行会占用源码很大的空间。

    46330

    Rust学习笔记之包、Crate和模块

    一个包会包含有一个 Cargo.toml 文件,阐述如何去构建这些 crate。 crate 是一个「二进制项或者库」。...crate root 是一个「源文件」,Rust 编译器以它为起始点,并构成你的 crate 的根模块。 ❝包中所包含的内容由几条规则来确立。...一个包中「至多只能」包含一个库 cratelibrary crate; 包中可以包含「任意多」个二进制 cratebinary crate; 包中「至少包含」一个 crate,无论是库的还是二进制的。...❝通过将文件放在 src/bin 目录下,一个包可以拥有「多个二进制」 crate:每个 src/bin 下的文件都会被编译成一个独立的二进制 cratebinary crate。...另一方面,使用 use 引入结构体、枚举和其他项时,习惯是「指定它们的完整路径」。

    96010

    【Rust学习】15_使用路径引用模块树中的项目

    前言来看一下 Rust 如何在模块树中找到一个项目的位置,我们使用路径的方式,就像在文件系统使用路径一样。如果我们想要调用一个函数,我们需要知道它的路径。...我们将展示两种从 crate 根中定义的新函数 eat_at_restaurant 调用 add_to_waitlist 函数的方法。这些路径是正确的,但仍然存在另一个问题,这将阻止代码的编译。...我们更倾向于使用绝对路径,因为把代码定义和项调用各自独立地移动是更常见的。让我们尝试编译示例中的代码并找出为什么它还不能编译!...具有二进制文件和库的包的最佳实践我们提到过,一个包可以同时包含一个 src/main.rs 二进制 crate 根和一个 src/lib.rs 库 crate 根,并且两个 crate 都默认具有包名。...通常,具有这种同时包含库和二进制 crate 的模式的包在二进制 crate 中的代码刚好足以启动调用库 crate 中的代码的可执行文件。

    6710

    rust 代码组织结构

    在这些情况下,所有的 bin crate 都可以在同一个 package 中管理,这样可以共享版本号、依赖和构建设置,使得项目的管理变得更加方便。...在 package 中,library crate 的名字与 package 的名字相同,这使得在使用 cargo build 或 cargo publish 等命令时,cargo 可以明确知道应该编译或发布哪个...另外,如果一个 package 中有多个 library crate,那么在编译时,cargo 也需要知道应该编译哪个 crate,这将使得编译过程变得更复杂。...如何仅在 Crate 内公开,而不在 Crate 外公开呢?简单的做法:在 lib.rs 中不导出就可以了。...惯用做法: 引入函数时,只引入到函数的上层模块,然后通过 xxx::func() 的形式调用,函数归属会比较清晰; 引入 struct、enum 时,就全路径直接引入。 as 为引入的路径取别名。

    7400

    【Rust学习】13_package 和 crate

    这些功能有时统称为模块系统,包括:Packages:一个 Cargo 功能,可让您构建、测试和共享 crateCrates:生成库或可执行文件的模块树Modules:用于控制作用域和路径的私有性Paths...:一种命名项的方法,例如结构、函数或模块本章将会涵盖所有这些概念,讨论它们如何交互,并说明如何使用它们来管理作用域。...内容首先我们将介绍的模块系统的第一部分 package 和 crate。crate 是 Rust 编译器一次考虑的最小代码量。...crate 可以包含模块,并且这些模块可以使用 crate 编译的其他文件中定义,正如我们将在接下来的部分中看到的那样。crate 可以有两种形式:二进制 crate 或库 crate。...软件包是一个或多个 crate 的捆绑包,可提供一组功能。一个包,包含一个 Cargo.toml 文件,该文件描述了如何构建这些 crate。

    8610

    Rust FFI 编程 - bindgen 使用示例

    本文我们将通过一个示例,讨论如何使用 bindgen 将 C 库中的函数公开给 Rust。...我们的目标是创建一个 crate 项目,其中包含一个bindings.rs文件,该文件代表 C 库的公共 API(包括函数,结构体,枚举等),然后通过将该 crate 导入其它项目中来调用原 C 库的功能...设置 crate 项目 一般 Rust FFI 绑定的 crate 项目会包含构建和导出 C 库的 unsafe 函数, crate 的 Rust 标准命名约定为lib-sys,我们本次示例...其次在 crate 项目的根目录下创建一个build.rs文件,用来编译和链接bindgen的导出。我们可以通过 C 库的源代码,也可以直接通过链接库,本文选择通过链接库的方式。...parse_callbacks是指当更改包含的任何头文件时,生成的 crate 无效。

    2K100

    ASUS ROG Armory Crate Lite Service v4.2.8 中的权限提升分析 (CVE-2021-40981)

    要利用此漏洞,管理员必须在攻击者将恶意 DLL 放入路径后对受感染机器进行身份验证C:\ProgramData\ASUS\GamingCenterLib\.DLL。...让我们看看设置哪些过滤器来过滤所有不符合报告费用的操作: 操作-is-CreateFile-Include 结果 - 包含 - 未找到 - 包含 结果 - 包含 - 没有 - 包含 路径 - 以 - ....这条路径非常有趣,因为与 的子文件夹不同C:\Program Files\,默认情况下 的子文件夹C:\ProgramData\没有安全 ACL,因此非特权用户极有可能在其中一个中写入。...现在我们知道任何人都拥有写权限,C:\ProgramData\ASUS\GamingCenterLib\我们只需要编译一个包含我们想要执行的代码的 DLL,并将其“拖放”到磁盘上名为.DLL....\设置不正确。

    3.5K90

    【Rust学习】16_抽离模块到独立的文件

    当模块变大时,您可能希望将它们的定义移动到单独的文件中,以便更轻松地浏览代码。内容现在让我们先把餐厅模块的代码进行梳理。我们将把模块提取到文件中,而不是在crate根文件中定义所有模块。...编译器知道要查找这个文件,因为它在 crate 根中遇到了名为 front_of_house模块声明。...目录和一个 hosting.rs 文件来包含在 hosting 模块中定义的内容:pub fn add_to_waitlist() {}如果我们 hosting.rs 放在 src 目录中,编译器会期望...,我们已经介绍了Rust编译器使用的最具惯用性的文件路径,但Rust还支持一种较旧的文件路径风格。...这些路径可以通过 use 语句引入作用域,这样你就可以在该作用域内使用该项时使用较短的路径。默认情况下,模块代码是私有的,但您可以通过添加 pub 关键字将其公开。

    4810

    第2章 | Rust 导览

    属性可用于控制编译器警告和代码风格检查、有条件地包含代码(就像 C 和 C++ 中的 #ifdef 一样)、告诉 Rust 如何与其他语言编写的代码互动,等等。后面还会介绍更多的属性示例。...C 和 C++ 要求 main 在程序成功完成时返回 0,在出现问题时返回非零的退出状态,而 Rust 假设只要 main 完全返回,程序就算成功完成。...crates.io 上这些 crate 的版本很可能比此处展示的版本新,但通过指明在测试此代码时所使用的特定版本,可以确保即使发布了新版本的包,这些代码仍然能继续编译。...main 函数很简单:它调用 HttpServer::new 创建了一个响应单个路径 "/" 请求的服务器,打印了一条信息以提醒我们该如何连接它,然后监听本机的 TCP 端口 3000。...这些类型和函数之间的关系都是在编译期指定的。如果使用了 Actix 不知道该如何处理的参数类型来编写处理函数,那么 Rust 编译器会直接向你报错。

    8310
    领券