swift c文件和.h头文件的链接器错误

k5hmc34c  于 9个月前  发布在  Swift
关注(0)|答案(1)|浏览(98)

我有一个Xcode项目,我使用C来处理一个低级任务,所以我创建了C文件和桥接头。然而,当我试图构建我的项目时,我得到了一个链接器错误:“Linker command failed with exit code 1(use -v to see invocation)”
下面是我的.c文件:

#include <stdio.h>
#include <IOKit/IOKitLib.h>

typedef struct {
    uint32_t datasize;
    uint32_t datatype;
    uint8_t data[32];
    
} SMCVal_t;

io_connect_t conn;

kern_return_t openSMC(void) {
    
    kern_return_t result;
    kern_return_t service;
    io_iterator_t iterator;
    
    service = IOServiceGetMatchingServices(kIOMainPortDefault, IOServiceMatching("AppleSMC"), &iterator);
    if(service == 0) {
        printf("error: could not match dictionary");
        return 0;
    }
    result = IOServiceOpen(service, mach_task_self(), 0, &conn);
    IOObjectRelease(service);
    return 0;
}

    
kern_return_t closeSMC(void) {
    return IOServiceClose(conn);
}

double getTemperature(char *key);
    
kern_return_t readSMC(char *key, SMCVal_t *val) {

    kern_return_t result;
    uint32_t keyCode = *(uint32_t *)key;
    
    SMCVal_t inputStruct;
    SMCVal_t outputStruct;
    
    inputStruct.datasize = sizeof(SMCVal_t);
    inputStruct.datatype = 'I' << 24;            //a left shift operation. turning the I into an int by shifting the ASCII value 24 bits to the left
    
    inputStruct.data[0] = keyCode;
    result = IOConnectCallStructMethod(conn, 5, &inputStruct, sizeof(SMCVal_t), &outputStruct, (size_t*)&inputStruct.datasize);
    
    if (result == kIOReturnSuccess) {
        if (val -> datasize > 0) {
            if (val -> datatype == ('f' << 24 | 'l' << 16 | 't' << 8 )) {
                float temp = *(float *)val -> data;
                return temp;
            }
        }
    }
    return 0.0;
    
}

    
int main(void) {
    
    kern_return_t result;
    
    result = openSMC();
    
    if(result == kIOReturnSuccess) {
        double temp = getTemperature("TC0P");
        printf("temp: %.2f\n", temp);
        
        result = closeSMC();
    }
    return 0;
}

字符串
下面是我对应的头文件:

#ifndef getsmc_h
#define getsmc_h
#include <stdio.h>
#include <IOKit/IOKitLib.h>

typedef struct {
    
    uint32_t datasize;
    uint32_t datatype;
    uint32_t data[32];
    
} SMCVal_t;

kern_return_t openSMC(void);
kern_return_t closeSMC(void);
kern_return_t readSMC(char *key, SMCVal_t *val);

double getTemperature(char *key);

#endif /* getsmc_h */

r6hnlfcb

r6hnlfcb1#

您的C文件只有声明行

double getTemperature(char *key);

字符串
稍后,将在main函数中访问此函数,

double temp = getTemperature("TC0P");


由于没有getTemperature函数可供链接器链接,这将导致发生链接器错误。
顺便说一下,你的C文件不包括头文件,所以它对编译和链接没有任何影响。

相关问题