【问题标题】:unresolved symbol pthread_create, first referenced in ./armrtk/src/task.obj未解析的符号 pthread_create,首先在 ./armrtk/src/task.obj 中引用
【发布时间】:2021-01-05 16:05:13
【问题描述】:

我这几天一直在尝试解决这个问题,但无法解决。我正在使用 CCS 作为 IDE,并且正在使用 Windows。我正在尝试在 MSP432 上创建一个 RTOS 内核,并且需要使用 pthreads。我已经能够在其他示例中使用 pthreads,但我正在尝试编写自己的程序,并且在构建时遇到了这个问题:

unresolved symbol pthread_create, first referenced in ./armrtk/src/task.obj

我已将文件路径包含在 CCS 中,但我无法使用 .cfg 文件,因为我没有使用 XDCTools。我只需要这方面的帮助,我非常感谢。 我也收到警告:

in pthread_create in TASK.C: #169-D argument of type "void *" is incompatible with parameter of type "void *(*)(void *)"

TASK.H

#ifndef TASK_H
#define TASK_H

#include <pthread.h>


struct task_t {
pthread_t* thread;
int threadCheck;
int state;
};

void *task1(void);
void *task2(void);

struct task_t *create_task(void* functionptr);

void delete_task(void *task);

 #endif

TASK.C

 #include <task.h>
 #include <stdlib.h>
 #include <pthread.h>

 #define BLOCKED -1
 #define READY 0
 #define RUNNING 1

 int testValue1 = 0;
 int testValue2 = 0;
 struct task_t *new_task;
 pthread_t pntr;

 struct task_t *create_task(void* functionptr) {

     new_task = malloc(sizeof(struct task_t));

     if(!new_task)
        return NULL;

    //set State of the new thread to ready
    new_task->state = 0;
    // check to see if pthread is created
    **new_task->threadCheck = pthread_create(new_task->thread, NULL, functionptr, NULL);**

    if(new_task->threadCheck!= 0){
        //thread failed
        return NULL;
    }

    return new_task;

    }

    void delete_task(void *task) {
        if(task != NULL){
            free(task);
            pthread_exit(NULL);
    }
}

【问题讨论】:

  • 我看不到如何从 pthreads 创建 RTOS 内核。 AFAIK,实际 POSIX 操作系统之外的大多数 pthreads(POSIX 线程)实现都是现有本机 RTOS 之上的一层。如果 pthreads 可用,则您要么已经拥有 RTOS,要么线程支持不支持实时,并且尝试从它顶部创建 RTOS 注定要失败。 RTOS 的主要功能是多线程/任务,因此创建 RTOS 内核必须实现线程 - 您不能仅通过包含 pthreads.h 就神奇地获得线程,即使那样您也必须链接库。跨度>
  • "我已经包含了文件路径...";什么“文件路径”?到什么文件?您了解 pthreads.h 不是 库吗?您需要链接 libpthreads.a,但我怀疑这是否可行; pthreads 需要底层 RTOS 来提供线程支持;您不能 pthreads 创建RTOS。先有鸡,后有蛋。

标签: embedded kernel rtos msp432


【解决方案1】:

unresolved symbol 错误是链接器错误,而不是编译器错误。您未能链接 pthreads 库。

关于警告functionptrvoid*,其中pthread_create() 需要一个带有签名void fn(void*) 的函数指针。

您的任务函数在任何情况下都有不同的签名:void fn(void),因此无论如何您都需要将函数指针转换为对pthread_create() 的调用(尽管您失去了将信息传递到通过省略 void* 参数的任务函数)。

修改task.h:

typedef void* (*task_t)(void);
struct task_t *create_task( task_t functionptr);

task.cpp中的

new_task->threadCheck = pthread_create( new_task->thread, 
                                        NULL, 
                                        (void (*)(void *))functionptr, 
                                        NULL ) ;

pthread_create() 单独调用中的强制转换会抑制警告,但将函数指针作为通用 void* 传递是不好的形式,因为如果您要传递函数以外的任何内容,它会阻止编译器警告您预期表单的指针指向to the create_task()`

【讨论】:

  • 如何链接它?我尝试了多种方法,但我没有任何运气。我正在使用 Code Composer Studio。感谢您的帮助。
  • 我已尝试转到项目 -> 属性 -> CCS 构建并编辑从 ${CCS_UTILS_DIR}/bin/gmake -j -k -j 4 到 ${CCS_UTILS_DIR}/bin/ 的构建命令gmake -j -pthread -k -j 4. 这是正确的还是我必须在 Arm Linker 中做一些事情。
  • @Mperez 当然在 gmake 命令中添加一个参数不会有任何用处。正如我在对该目标中的问题的评论中所说,我希望 pthreads 是 RTOS 顶部的可选层,而不是构建 RTOS 的东西。我不熟悉您的工具链或您的目标,但经验告诉我,您缺少一些在处理 RTOS 之前需要的基本概念。
  • 我对 RTOS 缺乏一些了解。这应该是我的高级项目,直到今年我才听说过 RTOS。这是一个陡峭的学习曲线。我考虑过远离 pthreads,但我的伙伴有其他想法。我一直试图弄清楚这一点,但一直缺乏方向。我们只使用 pthreads 来包含任务,正在讨论使用 OSthreads 甚至只是一个任务结构并完全删除线程。
  • 谢谢。那是我一直在遵循的教科书。我需要再看一遍并再次完成它,谢谢克利福德。感谢您的帮助。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
相关资源
最近更新 更多