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

编译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 使用的路径语法,以引用来自其他模块的语法项,并展示如何导入这些语法项,以便你使用它们而不必写出其完整路径

13910

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

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

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

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

    8310

    听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编译单元之间可能存在依赖关系,即某个编译单元依赖于其他编译单元。

    9010

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

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

    10010

    Rust 开发命令行工具(中)

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

    33120

    Rust + Android 的集成开发设计

    当第三方 crate 可能对广泛的社区更有益,我们的目标是将 crate 优先引入。...同样地,当为 Android 开发的 crate 能够使广泛的 Rust 社区更为受益,我们希望将其作为独立的库发布。...通常用于设置生成环境,或者使用其它语言的构建库(例如 C/C++),类似于配置使用其它语言的脚本。 避开 build.rs 脚本,从某种程度上说,也是不依赖于 Cargo。...源码生成 crateC/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 引入结构体、枚举和其他项,习惯直接引入它们的完整路径。 当需要引入很多定义于相同包或相同模块的项,为每一项单独列出一行会占用源码很大的空间。

    44030

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

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

    92110

    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 无效。

    1.9K100

    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.3K90

    第2章 | Rust 导览

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

    7510

    Rust中使用模块组织代码

    Rust 项目的代码组织包含以下三个基本概念: Package(包) Crate(箱) Module(模块) Package Package 用于管理一个或多个 Crate。...如果我们的 src 目录中同时包含 main.rs 和 lib.rs,那么我们将在这个 Package 中同时得到一个二进制 Crate 和一个库 Crate,这在开发一些基础库非常有用,例如你使用...Crate Crate 是 Rust 的最小编译单元,即 Rust 编译器是以 Crate 为最小单元进行编译的。Crate 在一个范围内将相关的功能组合在一起,并最终通过编译生成一个二进制或库文件。...关键字相对路径对模块进行访问: super:上层模块 self:当前模块 当上层模块,当前模块或子模块中拥有相同名字的成员,使用 super 与 self 可以消除访问的歧义: fn function...("{}", mod1::MESSAGE); } 将模块映射到文件夹 当一个文件夹中包含 mod.rs 文件,该文件夹可以被作为一个模块: src ├── main.rs └── mod1 └

    55710

    【Rust 研学】Rust Nation UK 2024 | Rust ABI 稳定之路

    Rust 编译模型 Rust crate 从源码编译为 rlib 文件(Rust ABI 的静态库),有点像 C 的 .o 文件和头文件一样。它会被下游依赖。...一个符号表,通常是一个包含符号和包含该符号的目标文件的偏移量的列表。 当项目里所有 crate编译完成之后,它们会被链接到一个二进制文件中。...另外,内联函数和泛型的工作方式是在编译时分发到不同的 crate 中。 其他语言怎么稳定 ABI ? C-ABI C-ABI 现在是事实标准。...重要的是,如何解决泄漏实现细节的问题。 考虑这个案例。 在 crate A 中定义了结构体 Foo ,然后在 crate B 中使用它。...那么 crate B 如何crate A 一起“工作”呢? 解决方案是让 crate A 导出一个类型描述符,其中包含使用此类型所需的所有信息,包括大小、内存布局、析构函数等信息。

    31410

    听GPT 讲Rust Cargo源代码(8)

    通过设置不同的字符集,可以正确解析和显示不同编码的文件名。 Prefix枚举类型定义了在生成项目文件树为每个文件和目录添加的前缀。它包含多个选项,例如无前缀、目录前缀、文件前缀等。...它包含文件的路径和归档的选项,比如是否压缩。 VcsInfo是一个枚举类型,表示版本控制系统的信息。它可以是Git、Hg等版本控制系统的URL地址。...包含了修复前后的文件路径,修复前后的文本内容,以及修复前后的源码位置信息等。通过FixedCrate结构体,可以将不同crate的修复信息存储在同一个FixedFile中。...当进行编译操作,可以利用多个线程来加快编译速度。 message_format:这个字段用于设置编译器输出信息的格式。可以选择简略信息或详细信息来满足开发者的需求。...target_rustdoc_args:这个字段用于设置生成文档的 Rustdoc 参数。 target_rustc_args:这个字段用于设置编译的 Rustc 参数。

    9310

    第8章 | 测试与文档、依赖项、发布、工作空间

    另一种方法是指定一个包含 crate 源代码的目录: image = { path = "vendor/image" } 如果你的团队有个做版本控制的单一存储库,而且其中包含多个 crate 的源代码...每个 crate 都可以使用相对路径指定其依赖项。 对依赖项进行这种层级的控制是一项非常强大的特性。...即使两个 crate 具有共同的依赖项,它们也不能共享任何已编译的代码。这好像有点儿浪费。 你可以使用 Cargo 工作空间来节省编译时间和磁盘空间。...如果你的项目在 GitHub 上,那么 Travis CI 可以在每次推送构建和测试你的代码。设置起来非常容易,有关详细信息,请参阅 travis-ci.org。...运行 cargo install cargo-readme 来安装此插件,然后运行 cargo readme --help 来学习如何使用它。 我们将继续前行。

    6410

    规则宏的“卫生保健”

    相比近乎“徒手攀岩”的Cpp模板·元编程,rustc提供了有限的编译宏代码检查功能(名曰:Mixed Hygiene宏的混合保健)。...宏代码验证功能的有限性体现在rustc仅只对·宏展开式·内的 本地变量 标签 当前包引用 执行编译检查。 咦!“宏展开式”是什么概念?这是一个好问题。...接着,我们再逐一论述【宏的混合保健】是如何保护【本地变量】与【当前包引用】的。...宏定义内使用完全限定路径crate::logger::log2db来引用宏外部函数,下游crate B依旧不可避免地出现 要么,找不到B::logger::log2db 要么,找到不正确的B::logger...Mixed Hygiene要求 @开发者,在宏展开式内,始终以元变量$crate::引用当前包。相对于保留关键字crate::,元变量$crate::总是被展开为宏定义端包根模块的引用路径

    76110
    领券