Visual Studio Code(mac)和语言C的问题

时间:2019-02-22 21:34:25

标签: c xcode macos clang llvm-gcc

我需要学习用C语言进行学习,因此我为此使用Visual Studio代码。 之前我不得不用Pascal编写代码,这就是为什么我已经有了xcode,安装fpc的原因。

最近,我想对存储进行一些清洁,并且删除了一些应用程序。不幸的是,我删除了Xcode(不是故意的)。 现在,我需要它来用C语言编写代码,我重新安装了它。我无法编译我的程序。我认为文件有问题。我收到了clang错误(clang:错误:无输入文件),并在Visual Studio代码中得到了此信息:

Undefined symbols for architecture x86_64:
  "_a", referenced from:
      _voiturePresente in q2-32f9ff.o
     (maybe you meant: _modiff_adresse_client, _adresse )
  "_i", referenced from:
      _saisieClient in q2-32f9ff.o
      _voiturePresente in q2-32f9ff.o
      _VoituresRepares in q2-32f9ff.o
     (maybe you meant: _infoClient, _immatriculation )
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern int i,a;
    char nom[5][50]; 
    char prenom[5][50];
    char adresse[5][1000];
    char marque[5][50]; 
    char modele[5][50];
    int immatriculation[5];
    int statut_reparation[5]; //un booléen est defenis comme valant soit 0 soit 1, n'ayant pas de type pour ca, j'ai mis int


void saisieClient() {
    for (i=0; i<5; i++) {
        printf(" nom du client %d \n", i);
        scanf("%s", nom[i]);
        printf(" Prénom : \n");
        scanf("%s", prenom[i]);
        printf(" adresse : \n");
        scanf("%s", adresse[i]);
        printf(" marque voiture : \n");
        scanf("%s", marque[i]);
        printf(" modèle : \n");
        scanf("%s", modele[i]);
        printf(" immatriculation : \n");
        scanf("%d", &immatriculation[i]);
        printf(" statut des réparation : \n");
        scanf("%d", &statut_reparation[i]);
    }
}
void infoClient(int a) {
    printf("nom : %s \n", nom[a]);
    printf("prenom : %s \n", prenom[a]);
    printf("adresse : %s \n", adresse[a]);
    printf("marque voiture: %s \n",marque[a]);
    printf("modele voiture: %s \n",modele[a]);
    printf("immatriculation voiture: %d \n",immatriculation[a]);
    if (statut_reparation[a]==1) 
    {
        printf("statut des reparations: réparé \n");
    }
    else 
    {
        printf("statut des reparations: pas réparé \n");
    }
}
void voiturePresente() {
    for (i=0 ; i<5 ; i++){
        printf("marque : %s \n", marque[i]);
        printf("modele : %s \n",modele[i]);
        printf("immatriculation : %d \n",immatriculation[i]);
        if (statut_reparation[a]==1) 
        {
            printf("statut des reparations: réparé \n");
        }
        else 
        {
            printf("statut des reparations: pas réparé \n");
        }
    }
}
void modiff_adresse_client(int x){
        printf("nouvelle adresse : ");
        scanf("%s", adresse[x]);
}
void VoituresRepares(void) {
    for (i=0; i<5; ++i) 
    {
        if (statut_reparation[i]==1) 
        {
            printf("la voiture du client %d \n", i);
            printf("est réparé. voici sa fiche client: \n");
            printf("nom : %s \n", nom[i]);
            printf("prenom : %s \n",prenom[i]);
            printf("adresse : %s \n", adresse[i]);
            printf("marque voiture: %s \n",marque[i]);
            printf("modele voiture: %s \n",modele[i]);
            printf("immatriculation voiture: %d \n",immatriculation[i]);
        }
    }
}


int main () {
    saisieClient();
    infoClient(3);
    voiturePresente();
    modiff_adresse_client(3);
    VoituresRepares();
}

我同时卸载了(Xcode和Visual Studio Code),但是仍然有相同的问题。 我还再次尝试了一些命令,例如xcode-select --install,但没有任何变化。

PS:我拥有最新版本的OS,Visual Studio代码和Xcode。当我做gcc -v时我得到了这个:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

1 个答案:

答案 0 :(得分:1)

extern int i,a;

告诉编译器(和链接器)符号ia是在另一个translation unit中定义的。

如果未在某处定义它们,则会出现此类错误。解决您的问题的主要方法是不仅声明变量,而且定义。就像处理所有其他变量一样。您可以通过删除extern关键字来实现。

正确的解决方案不是将它们定义为全局变量,而只是将其定义为使用该变量的函数内部的局部变量。

我个人对您所提供代码的反映告诉我,您需要退后几步,回到您的书籍,教程或课堂笔记。也许甚至是一开始。