2016-01-13 64 views
0

我下载了this source code (.zip),并希望在我的Mac(OSX 10.11.2)上用XCode V7.2(7C68)进行编译。我应该如何编译这个C代码?

我开始编制该文件fdist.c

gcc -o fdist2 -O fdist.c -lm 

但它返回一个长系列的警告和错误(见下文)。看着这个文件,我发现它确实不像我习惯的那种代码。通常情况下,函数返回的对象类型似乎未指定。

README_fdist2没有什么帮助。有关于如何编译代码的指导原则,但第一行存在拼写错误。

我该如何编译这段代码?


下面是错误和警告gcc -o fdist2 -O fdist.c -lm返回

fdist2.c:42:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
main() 
^ 
fdist2.c:117:3: warning: implicit declaration of function 'sim1' is invalid in C99 
     [-Wimplicit-function-declaration] 
       sim1(init,initot,rm,mu,freq_arr,val_arr,&noall); 
       ^
fdist2.c:119:4: warning: implicit declaration of function 'my_thetacal' is invalid in C99 
     [-Wimplicit-function-declaration] 
         my_thetacal(freq_arr,noall,init,Subs,&h0,&h1,&fst); 
         ^
fdist2.c:136:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
sim1(init,initot,rm,mu,freq_arr,val_arr,noall) 
^ 
fdist2.c:222:3: warning: implicit declaration of function 'dfill' is invalid in C99 
     [-Wimplicit-function-declaration] 
       dfill(); 
       ^
fdist2.c:234:4: warning: implicit declaration of function 'cnode' is invalid in C99 
     [-Wimplicit-function-declaration] 
         cnode(k); 
         ^
fdist2.c:237:8: warning: implicit declaration of function 'mnode' is invalid in C99 
     [-Wimplicit-function-declaration] 
       else mnode(k); 
        ^
fdist2.c:252:1: warning: control may reach end of non-void function [-Wreturn-type] 
} 
^ 
fdist2.c:254:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
thetacal(gen,noall,sample_size,no_of_samples,het0,het1,fst) 
^ 
fdist2.c:293:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 
fdist2.c:301:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
dfill() 
^ 
fdist2.c:312:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 
fdist2.c:315:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
cnode(sp) 
^ 
fdist2.c:349:2: error: non-void function 'cnode' should return a value [-Wreturn-type] 
     return; 
     ^
fdist2.c:353:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
mnode(sp) 
^ 
fdist2.c:464:2: error: non-void function 'mnode' should return a value [-Wreturn-type] 
     return; 
     ^
fdist2.c:489:10: warning: implicit declaration of function 'poidev' is invalid in C99 
     [-Wimplicit-function-declaration] 
     mutno = poidev(time*mu); 
       ^
fdist2.c:491:12: warning: implicit declaration of function 'addmut' is invalid in C99 
     [-Wimplicit-function-declaration] 
       p->dna = addmut(p->dna); 
         ^
fdist2.c:676:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
mom(x,n,x1,x2,x3,x4,min,max) 
^ 
fdist2.c:707:2: error: non-void function 'mom' should return a value [-Wreturn-type] 
     return; 
     ^
fdist2.c:761:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
my_thetacal(gen,noall,sample_size,no_of_samples,het0,het1,fst) 
^ 
18 warnings and 3 errors generated. 

回答

3

问题不在于编译器,而在于您的代码不遵循语法。 C99要求提前声明所有变量和函数。函数和类定义应放置在.h头文件中,然后包含在引用它们的.c源文件中。

mycode.h:

int myFunction (int a, char * s);

mycode.c中

#include "mycode.h" 

int main(int argc, char **argv) { 
    int x = 2; 
    char * str = "Hello"; 
    int r = myFunction(x,str); 
    return r; 
} 
3

貌似代码不符合C99与隐函数declrations,默认返回(INT)等

命令

这似乎并不难解决它。但是如果你不想或者不能,那么你可以尝试在C89/C90中编译,其中隐式int返回有效。这应该修复大部分即使不是全部的警告。

gcc -std=c89 -o fdist2 -O fdist.c -lm 
+0

谢谢您的回答。我试过'-std = c89'和'-std = c90',但在两种情况下仍然失败。 –

+0

你仍然得到所有这些警告?另一个选项是'-std = gnu89'。如果没有,你可以为函数做声明。这就是你需要真正解决它们的问题。 –

+0

我没有得到相同的警告,但我仍然得到相同的错误。与'-std = gnu89'一样。所以我想,我只需要自己编辑代码的合成代码,对吧? –