0

このリンクエラーが発生する理由がわかりません。すべてが正しくリンクされていると確信しています。

gcc -Wall -Wextra -o test driver.c target.c 
driver.c:8: warning: unused parameter ‘argc’
ld: duplicate symbol _first in /var/folders/yx/31ddgzsj4k97jzvwhfx7tkz00000gn/T//ccw2n48G.o and /var/folders/yx/31ddgzsj4k97jzvwhfx7tkz00000gn/T//ccKZdUlG.o for architecture x86_64
collect2: ld returned 1 exit status

単純なリンクリストである次のコードがありますが、なぜコンパイルされないのかわかりません

driver.c

 #include "target.h"
 #include <stdio.h>
 #include <stdlib.h>

char * prog;
int main(int argc, char * argv[]){
  prog = argv[0];
  print_target_list(1);
  .....

target.c

#include "target.h"
/* This function returns true if there is a target with name in the target linked list */
bool is_target(char * name){
    struct target_node * ptr = first;
   while(ptr != NULL){
    if(strcmp(ptr->name,name) == 0){
      return true;
    }
    ptr = ptr->next;
  }
  return false;
}
......

target.h

#ifndef TARGET_H
#define TARGET_H

//#include "source.h"
#include <stdbool.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

/*-----------------------------------------*/

extern char * prog;

/*-----------------------------------------*/

struct source_node{
  char * name;
};

struct target_node{
  char * name;
  struct target_node * next;
  struct source_node * src_node;
};

struct target_node * first = NULL;

/*-----------------------------------------------------*/


/* return 1 if name is in the target linked list 0 otherwise */
bool is_target(char * name);
/* returns a new target_node */ 
struct target_node * new_target_node(char * name);
/* insert a new target_node into the list */
void insert_target_node(char * name);
/* remove a target_node from the list */
void remove_target_node(char * name);
/* print the current linked list */
void print_target_list(int opts);


#endif

どんな助けでも適用されます

4

2 に答える 2

2

使用中target.h

extern struct target_node * first;

そして、適切なtarget.cファイルに以下を配置します。

struct target_node * first = NULL;

firstの外部で必要ない場合は、完全target.cに削除できます(また、グローバル名前空間に不必要に配置することを避けたい場合は、削除することもできます)。target.hstatictarget.c

于 2012-04-18T01:17:27.147 に答える
1

外部リンケージを持つオブジェクトは、プログラム全体で1回だけ定義する必要があります。

ヘッダーファイルで定義struct target_node * firstし、そのヘッダーファイルを2つの異なる実装ファイルにインクルードしました。これで、プログラムに2つの定義がfirstあります。そしてfirst、外部リンケージを持つオブジェクトです。したがって、エラー。

于 2012-04-18T01:17:51.637 に答える