/home/orangepi/code/mpp/osal/inc/mpp_time.h:29: error: expected ‘,’ or ‘...’ before numeric constant In file included from /home/orangepi/code/mpp_rtsp/MppDecode.h:17, from /home/orangepi/code/mpp_rtsp/MppDecode.cpp:5: /home/orangepi/code/mpp/osal/inc/mpp_time.h:29:44: error: expected ‘,’ or ‘...’ before numeric constant 29 | #define msleep(x) usleep(x * 1000) | ^~~~
时间: 2023-09-12 09:09:48 浏览: 145
这个错误是因为在 `mpp_time.h` 头文件中的 `msleep` 宏定义中出现了一个预处理器错误。这个错误可能是由于在宏定义中使用了一个数字常量而没有给它命名,或者在头文件中定义了一个与 `msleep` 名称相同的常量。
你可以在 `MppDecode.cpp` 文件中使用 `#undef msleep` 来取消 `msleep` 宏定义,然后按照需要重新定义它。或者你也可以在 `mpp_time.h` 文件中给数字常量命名,例如:
```c
#define MSLEEP_TIME_FACTOR 1000
#define msleep(x) usleep(x * MSLEEP_TIME_FACTOR)
```
这样就可以避免这个错误了。
相关问题
#if defined(_WIN32) && !defined(__MINGW32CE__) #include <windows.h> #define msleep Sleep #define sleep(x) Sleep(x *1000) #else #define msleep(x) usleep(x * 1000) #endif这一段代码发生了这样一个报错/home/orangepi/code/mpp/osal/inc/mpp_time.h:29: error: expected ‘,’ or ‘...’ before numeric constant In file included from /home/orangepi/code/mpp_rtsp/MppDecode.h:17, from /home/orangepi/code/mpp_rtsp/MppDecode.cpp:5: /home/orangepi/code/mpp/osal/inc/mpp_time.h:29:44: error: expected ‘,’ or ‘...’ before numeric constant 29 | #define msleep(x) usleep(x * 1000) | ^~~~
这个报错是因为在这段代码中,宏定义 `msleep(x)` 的后面没有加上分号,导致编译器无法正确解析代码。你可以在这行代码的末尾加上分号,如下所示:
```
#define msleep(x) usleep(x * 1000);
```
这样就可以解决这个报错了。另外,注意在使用宏定义时,最好加上括号,以避免优先级问题导致的错误。例如:
```
msleep(1000); // 最好改为 msleep(1000);
```
END /tmp/ffconf.NMsfV39s/test.c /opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --sysroot=/opt/android-ndk-r18b/sysroot -I/home/chang/dev/mpp/mpp_build/install/usr/local/include -fPIC -c -o /tmp/ffconf.NMsfV39s/test.o /tmp/ffconf.NMsfV39s/test.c /opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -L/home/chang/dev/mpp/mpp_build/install/usr/local/lib -lmpp --sysroot=/opt/android-ndk-r18b/sysroot -o /tmp/ffconf.NMsfV39s/test /tmp/ffconf.NMsfV39s/test.o /..//bin/ld: cannot find crt1.o: No such file or directory /..//bin/ld: cannot find crti.o: No such file or directory /..//bin/ld: cannot find crtbegin.o: No such file or directory /..//bin/ld: cannot find -lmpp /..//bin/ld: cannot find -lgcc /..//bin/ld: cannot find -lgcc_s /..//bin/ld: cannot find -lc /..//bin/ld: cannot find -lgcc /..//bin/ld: cannot find -lgcc_s /..//bin/ld: cannot find crtend.o: No such file or directory /..//bin/ld: cannot find crtn.o: No such file or directory clang: error: linker command failed with exit code 1 (use -v to see invocation) C compiler test failed.问题有进展吗?我指定了sysroot
<think>好的,用户遇到了编译错误,主要是链接器找不到一些关键的启动文件和库。让我仔细看看用户提供的信息。
用户在使用Android NDK的clang进行编译和链接时,虽然指定了sysroot,但依然出现找不到crt1.o、crti.o等启动文件,以及lmpp、lgcc等库的问题。首先,我需要分析这些文件的路径是否正确。
首先,用户的编译命令中使用了--sysroot=/opt/android-ndk-r18b/sysroot。但根据NDK的结构,sysroot通常位于platforms目录下的某个API级别的架构中。例如,r18b的sysroot路径可能是/opt/android-ndk-r18b/platforms/android-21/arch-arm。用户可能错误地将sysroot指向了NDK根目录下的sysroot,而那里可能没有所需的启动文件。
接下来,用户链接时找不到-lmpp,说明libmpp的路径可能没有正确指定。-L参数指向了/home/chang/dev/mpp/mpp_build/install/usr/local/lib,需要确认该路径下确实存在libmpp.so或libmpp.a。如果路径错误或库文件未正确安装,链接器自然找不到。
另外,关于-lgcc和-lgcc_s等库,NDK r18b之后已经移除了gcc的工具链,全面转向clang,因此可能需要使用不同的库,如libunwind或libc++。用户可能需要调整链接参数,比如使用-static-libstdc++或者检查是否有缺失的库路径。
可能的解决步骤包括:1. 检查sysroot路径是否正确指向特定平台和架构;2. 确认libmpp的安装路径是否正确,并确保链接器能找到;3. 添加必要的库路径,如使用-L指定NDK中的lib目录;4. 检查是否缺少其他依赖库或需要特定的链接参数。
用户可能没有正确配置目标平台和架构,导致sysroot路径错误。需要指导用户确认NDK的目录结构,并正确设置--sysroot,以及可能的--gcc-toolchain参数。此外,检查是否存在环境变量干扰,如CFLAGS或LDFLAGS,可能需要清理或调整这些变量。
最后,建议用户使用-v选项运行编译命令,查看详细的编译和链接过程,从而更准确地定位问题所在。同时,确保所有依赖库和头文件都正确安装,并且路径没有拼写错误。</think>根据您提供的编译错误信息,这个问题与Android NDK工具链配置相关。虽然您已指定`--sysroot`,但仍有多个关键文件缺失。以下是分步分析及解决方案:
---
### **一、错误原因分析**
1. **C Runtime启动文件缺失**
- `crt1.o/crti.o/crtbegin.o`等文件是C程序启动必需的初始化文件
- 典型路径:`$NDK/platforms/android-<API>/arch-<ARCH>/usr/lib`
2. **标准库链接问题**
- `-lmpp`、`-lc`、`-lgcc`等库未找到
- 可能原因:库搜索路径未正确配置
3. **NDK版本兼容性问题**
- 使用较旧的NDK r18b时,需要注意工具链目录结构变化
---
### **二、解决方案步骤**
#### **1. 验证NDK目录结构**
确认以下路径存在(以arm64-v8a为例):
```bash
/opt/android-ndk-r18b/platforms/android-21/arch-arm64/usr/lib/crtbegin_dynamic.o
/opt/android-ndk-r18b/platforms/android-21/arch-arm64/usr/lib/crtend_android.o
```
#### **2. 修正编译命令**
**关键参数调整:**
```bash
export NDK=/opt/android-ndk-r18b
export API=21
export ARCH=arm64 # 根据目标架构修改
export SYSROOT=$NDK/platforms/android-$API/arch-$ARCH
# 编译命令示例
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/clang \
--target=aarch64-none-linux-android21 \
--sysroot=$SYSROOT \
-I/home/chang/dev/mpp/mpp_build/install/usr/local/include \
-L/home/chang/dev/mpp/mpp_build/install/usr/local/lib \
-L$SYSROOT/usr/lib \
-fPIC -lmpp -lc -lunwind \
-o /tmp/ffconf.NMsfV39s/test \
/tmp/ffconf.NMsfV39s/test.c
```
#### **3. 关键参数说明**
| 参数 | 作用 |
|---------|-------|
| `--target` | 明确指定目标三元组(必要!) |
| `-L$SYSROOT/usr/lib` | 添加系统库搜索路径 |
| `-lunwind` | NDK r18+ 需要替换`-lgcc`为这个 |
#### **4. 验证mpp库安装**
检查库文件实际存在性:
```bash
ls -l /home/chang/dev/mpp/mpp_build/install/usr/local/lib/libmpp.so
# 如果使用静态库应存在libmpp.a
```
---
### **三、进阶调试建议**
1. **查看详细链接过程**
```bash
# 添加 -Wl,--verbose 参数查看链接器搜索路径
$NDK/.../clang -Wl,--verbose ...
```
2. **检查工具链兼容性**
```bash
# 确认使用的clang版本
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --version
```
3. **环境变量清理**
```bash
unset CFLAGS LDFLAGS # 避免其他环境变量干扰
```
---
### **四、典型修正后的路径结构**
```bash
NDK_ROOT
├── platforms
│ └── android-21
│ └── arch-arm64
│ ├── usr
│ │ ├── include
│ │ └── lib
│ │ ├── crtbegin_dynamic.o
│ │ ├── crtend_android.o
│ │ └── libc.so
└── toolchains
└── llvm
└── prebuilt
└── linux-x86_64
└── bin
└── clang
```
若问题仍未解决,请提供:
1. `find /opt/android-ndk-r18b -name crt1.o` 的输出
2. `ls -l /home/chang/dev/mpp/mpp_build/install/usr/local/lib` 的结果
3. 完整的编译命令(包含所有参数)
阅读全文
相关推荐















