riscv32交叉编译的pthread库问题

在进行嵌入式软件开发时,需要对其中一个ncnn-src开源代码进行交叉编译,我使用的是riscv32-unknown-elf,但在编译时发现程序中引用的pthread库能正常引用,但是pthread_mutex_init等函数时却出现了未声明的错误:

img

以下是我的CMakeList

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv32)

set(CMAKE_C_COMPILER "/opt/riscv/bin/riscv32-unknown-elf-gcc")
set(CMAKE_CXX_COMPILER "/opt/riscv/bin/riscv32-unknown-elf-g++")
set(ARM_SYSROOT "/opt/riscv/riscv32-unknown-elf")
set(CMAKE_FIND_ROOT_PATH "${ARM_SYSROOT}")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

set(CMAKE_CXX_FLAGS "-g -Wall -march=rv32g --sysroot=${ARM_SYSROOT}")
set(CMAKE_CXX_LINK_FLAGS "--sysroot=${ARM_SYSROOT}")
set(CMAKE_C_FLAGS "-g -Wall -march=rv32g --sysroot=${ARM_SYSROOT}")
set(CMAKE_C_LINK_FLAGS "--sysroot=${ARM_SYSROOT}")

set(CMAKE_BUILD_TYPE Debug)

cmake过程:

img

同时,我也尝试在芯来的开发平台Nuclei Studio进行编译,出现了同样的错误

请问如何解决上述pthread库的问题呢,我的开发板是riscv32的

默认的 riscv32-unknown-elf 工具链并不包含 pthread 库,所以函数不能用了

在交叉编译ncnn-src到riscv32时,出现pthread相关函数未声明的错误,这很有可能是跟编译环境的pthread库相关设置有关。
对于嵌入式开发,编译环境中的系统库需要特别设置和配置,否则就会出现很多不兼容的问题。
建议可以检查以下几点:

  1. 确认您的riscv32交叉编译工具链中是否包含了正确的pthread库。可能需要自行建立一个符合要求的libc。
  2. 在编译命令中显式链接pthread库,如-lpthread
  3. 设置编译环境变量,如C_INCLUDE_PATHLIBRARY_PATH,指向正确的pthread头文件目录和库文件目录。
  4. 在编译前定义宏_POSIX_C_SOURCE=200809L,使其包含pthread的功能声明。
  5. 尝试在代码中定义宏__USE_XOPEN2K,启用XSI扩展。
  6. 直接包含<pthread.h>而不是<sys/types.h>和<pthread.h>

可是我看include里有pthread.h啊

img

修改一下编译参数,再试试:

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv32)
 
set(CMAKE_C_COMPILER "/opt/riscv/bin/riscv32-unknown-elf-gcc")
set(CMAKE_CXX_COMPILER "/opt/riscv/bin/riscv32-unknown-elf-g++")
set(ARM_SYSROOT "/opt/riscv/riscv32-unknown-elf")
set(CMAKE_FIND_ROOT_PATH "${ARM_SYSROOT}")
 
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
 
set(CMAKE_CXX_FLAGS "-g -Wall -march=rv32g  -pthread --sysroot=${ARM_SYSROOT}")
set(CMAKE_CXX_LINK_FLAGS "--sysroot=${ARM_SYSROOT}")
set(CMAKE_C_FLAGS "-g -Wall -march=rv32g --sysroot=${ARM_SYSROOT}")

set(CMAKE_C_LINK_FLAGS "--sysroot=${ARM_SYSROOT}")
 
set(CMAKE_BUILD_TYPE Debug)

  1. 检查工具链:确保安装了正确的工具链以交叉编译到 RISC-V 架构。验证工具链是否支持 pthread 库及其相关函数。
  2. 验证库依赖关系:确保交叉编译过程中pthread库可用且正确链接。检查所需的 pthread 库文件是否存在于正确的位置。
  3. 包含pthread 头文件:确保pthread.h 头文件包含在您的源代码中。您可以在代码文件的开头添加“#include <pthread.h>”。
  4. 检查编译器标志:验证是否正确设置了必要的编译器标志,以进行具有 pthread 支持的交叉编译。您可能需要添加“-lpthread”或类似标志来在编译过程中链接 pthread 库。
  5. 确认库安装:仔细检查 pthread 库是否已安装在要运行编译代码的目标系统上。如果不存在,您可能需要单独安装。
  6. 更新代码:如果上述步骤均不起作用,则可能是您尝试编译的代码与 RISC-V 架构或您正在使用的特定工具链不兼容。在这种情况下,您可能需要修改代码或寻求 ncnn-src 社区或开发人员的支持。
    请记住查阅特定于 ncnn-src 项目的文档和资源,因为它们可能会提供交叉编译的额外指导或故障排除步骤。

pthread_multex_destory。这个问题可能是由于编译环境中的pthread库版本不兼容导致的。请确保你的编译环境中包含了正确的pthread库版本,并且与你的代码所需的pthread函数版本一致。