Компиляция из C в WebAssembly с использованием Emscripten - PullRequest
0 голосов
/ 07 мая 2020

Я хочу скомпилировать программу из C в WebAssembly. Программа должна взять число, вычислить простые числа до данного числа, а затем вернуть истекшее время (в микросекундах). Для компиляции я использовал Emscripten и получил такую ​​ошибку:

"C: \ Users \ Pawel \ Desktop \ Wasm \ main. c: 20: 1: error: неявное объявление функции calcPrimes 'недопустимо в C99
[-Werror, -Wimplicit-function-декларация]
calcPrimes (number);
^
сгенерирована 1 ошибка.
em cc: error:' C: / Users / Pawel / Desktop / emsdk / emsdk / upstream / bin \ clang.exe -target wasm32-unknown-emscripten -D__EMSCRIPTEN_major __ = 1 -D__EMSCRIPTEN_minor __ = 39 -D__EMSCRIPTEN_minor __ = 39 -D__EMSCRIPTEN_Tiny __ = 15 -D_ 2 -D_Tiny __ = 15 -D_ D __ unix -D__unix__ -Werror = неявное объявление-функции -Xclang -nostdsystemin c -Xclang -isystem C: \ Users \ Pawel \ Desktop \ emsdk \ emsdk \ upstream \ emscripten \ system \ include \ compat - Xclang -isystem C: \ Users \ Pawel \ Desktop \ emsdk \ emsdk \ upstream \ emscripten \ system \ include -Xclang -isystem C: \ Users \ Pawel \ Desktop \ emsdk \ emsdk \ upstream \ emscripten \ system \ включить \ lib c -Xclang -isystem C: \ Users \ Pawel \ Desktop \ emsdk \ emsdk \ upstream \ emscripten \ system \ lib \ li bc \ musl \ arch \ emscripten -Xclang -isystem C: \ Users \ Pawel \ Desktop \ emsdk \ emsdk \ upstream \ emscripten \ system \ local \ include -Xclang -isystem C: \ Users \ Pawel.emscripten_cache \ wasm \ include -DEMSCRIPTEN -fignore-exceptions C: \ Users \ Pawel \ Desktop \ Wasm \ main. c -Xclang -isystem C: \ Users \ Pawel \ Desktop \ emsdk \ emsdk \ upstream \ emscripten \ system \ include \ SDL - c -o C: \ Users \ Pawel \ AppData \ Local \ Temp \ emscripten_temp_nqmlki_g \ main_0.o -mllvm -combiner-global-alias-analysis = false -mllvm -enable-emscripten- sjlj -mllvm -disable-lsr 'failed (1) "

Заранее благодарим за любую помощь!
Мой код:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
long getDuration(int number){
struct timespec ts;
struct timespec {
    time_t   tv_sec;       
    long     tv_nsec;      
};

timespec_get(&ts, TIME_UTC);
long startsc = ts.tv_sec;
long startns = ts.tv_nsec;

calcPrimes(number);

timespec_get(&ts, TIME_UTC);
long endsc = ts.tv_sec;
long endns = ts.tv_nsec;

long resus = (endsc - startsc) * 1000000 + (endns/1000) - (startns/1000);
return resus;
}

int isPrime(int num) {
    int i;
    if(num == 2) return 1;
    if(num % 2 == 0) return 0;
    int sq = (int) sqrt(num) + 1;
    for(i = 3; i < sq; i = i + 2) if(num % i == 0) return 0;
    return 1;
}

int calcPrimes(int n) {
    int i, count = 0;
    for(i = 2; i <= n; i++) if(isPrime(i)) count++;
    return count;
}

1 Ответ

1 голос
/ 08 мая 2020

Вам не хватает форвардной декларации calcPrimes. Вам нужно либо добавить его, либо переместить getDuration под calcPrimes в вашем файле.

...