关于C_INCLUDES must be under the source or output directories

本文详细解析了在从Android N项目迁移到O项目时遇到的编译警告问题,主要原因是配置文件中使用了未定义的变量或绝对路径,导致编译系统错误地解析路径。通过检查Android.mk文件,将LOCAL_C_INCLUDES中的$(VAR)/include更正为相对路径,并确保所有路径都是从源代码树顶部开始的相对路径,最终解决了这一警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在Android N上的项目,正常编译,挪到O项目,就报这个异常,很是疑惑。

直接翻译过来,就是被include的目录,必须在源码或者输出的目录内。

Google一翻:

There are a couple of other things that can trigger this check -- I've seen both of these in practice:

1. Using $(VAR)/include in your LOCAL_C_INCLUDES, but when VAR isn't set. The build system then gets "/include", and before this check would attempt to look at the filesystem in that location. If that happened to be present on a machine, it could end up using that inappropriately.

即你配置的变量,在编译时并没定义,为空,所以变成错误的路径了。

2. Using an absolute path to a directory within the source path. This happens when someone overzealously uses $(abspath) or similar. Instead, make sure that all of your paths are relative paths from the top of the source tree. During a build, the working directory is always at the top of the source tree.

你使用了绝对路径,导致这个警告,你应该使用相对路径。

查了自己的Android.mk,发现一个定义正好是2的情况:

 LOCAL_PATH := $(call my-dir)
#TEST_PATH := $(shell pwd)/$(LOCAL_PATH) //原来配置的路径,为绝对路径
 TEST_PATH := $(LOCAL_PATH)/Other

修改之后,编译正常了。这边记录下,防止类似错误。。

#!/bin/sh #![allow(missing_abi)] /* # rust shebang by Mahmoud Al-Qudsi, Copyright NeoSmart Technologies 2020-2024 # See <https://neosmart.net/blog/self-compiling-rust-code/> for info & updates. # # This code is freely released to the public domain. In case a public domain # license is insufficient for your legal department, this code is also licensed # under the MIT license. # Get an output path that is derived from the complete path to this self script. # - `realpath` makes sure if you have two separate `script.rs` files in two # different directories, they get mapped to different binaries. # - `which` makes that work even if you store this script in $PATH and execute # it by its filename alone. # - `cut` is used to print only the hash and not the filename, which `md5sum` # always includes in its output. OUT=/tmp/$(printf "%s" $(realpath $(which "$0")) | md5sum | cut -d' ' -f1) # Calculate hash of the current contents of the script, so we can avoid # recompiling if it hasn't changed. MD5=$(md5sum "$0" | cut -d' ' -f1) # Check if we have a previously compiled output for this exact source code. if !(test -x "${OUT}" && test -f "${OUT}.md5" && \ test "${MD5}" = "$(cat "${OUT}.md5")"); then # The script has been modified or is otherwise not cached. # Check if the script already contains an `fn main()` entry point. if grep -Eq '^\s*(\[([^][]*)])*\s*fn\s+main\b' "$0"; then # Compile the input script as-is to the previously determined location. rustc "$0" -o ${OUT} # Save rustc's exit code so we can compare against it later. RUSTC_STATUS=$? else # The script does not contain an `fn main()` entry point, so add one. # We don't use `printf 'fn main() { %s }' because the shebang must # come at the beginning of the line, and we don't use `tail` to skip # it because that would result in incorrect line numbers in any errors # reported by rustc, instead we just comment out the shebang but leave # it on the same line as `fn main() {`. printf "fn main() {//%s\n}" "$(cat $0)" | rustc - -o ${OUT} # Save rustc's exit code so we can compare against it later. RUSTC_STATUS=$? fi # Check if we compiled the script OK, or exit bubbling up the return code. if test "${RUSTC_STATUS}" -ne 0; then exit ${RUSTC_STATUS} fi # Save the MD5 of the current version of the script so we can compare # against it next time. printf "%s" ${MD5} > ${OUT}.md5 fi # Execute the compiled output. This also ends execution of the shell script, # as it actually replaces its process with ours; see exec(3) for more on this. exec ${OUT} "$@" # At this point, it's OK to write raw rust code as the shell interpreter # never gets this far. But we're actually still in the rust comment we opened # on line 2, so close that: */ fn main() { let name = std::env::args().skip(1).next().unwrap_or("world".into()); println!("Hello, {}!", name); } // vim: ft=rust : 解释以下这段代码
最新发布
04-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值