2017-10-03 22 views
0

私はC言語でプログラムを書くために始めているが、私は次のエラーを持っていると私はその理由を把握することはできません。私の知る限り理解し未定義シンボル - C

Undefined symbols for architecture x86_64: 
    "_receiveByte", referenced from: 
     _main in main_prog.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [q1] Error 1 

、私が持っています適切なファイルと私のmakefileにすべて適切に含まれていますが、まだこのエラーが出ます。これは私のコードは次のようになります。

main_prog.c

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

#include "physical.h" 
#include "main_prog.h" 

int main(int argc, char *argv[]) 
{ 
    PhysicalState * initPhysical(); 
    const Direction blah = L2R; 

    unsigned char new_char; 
    new_char = receiveByte(blah); 

    printf("Done.\n"); 
} 

main_prog.h

#ifndef _MAIN_PROG_H 
#define _MAIN_PROG_H 

// nothing yet 

#endif 

physical.h

#ifndef _PHYSICAL_H 
#define _PHYSICAL_H 

#include <pthread.h> 

#define MAX_FRAME_SIZE 1024 

typedef enum 
{ 
    false, 
    true 
} boolean; 

typedef enum 
{ 
    L2R, 
    R2L 
} Direction; 

struct PHYSICAL_STATE 
{ 
    pthread_cond_t L2RTxSignal;  
    pthread_cond_t L2RRxSignal;  
    boolean   L2RReady;   
    pthread_mutex_t L2RLock;  

    pthread_cond_t R2LTxSignal;  
    pthread_cond_t R2LRxSignal;  
    boolean   R2LReady;   
    pthread_mutex_t R2LLock;   
}; 

typedef struct PHYSICAL_STATE PhysicalState; 

PhysicalState * initPhysical(); 

unsigned char receiveByte(const Direction dir); 

#endif 

とメイクファイルで指定されmain_prog.oファイルはobject/に位置を取得します、一方、最終的には

PROG = main_prog 
HDRS = physical.h main_prog.h 
SRCS = main_prog.c 

OBJDIR = object 
OBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(SRCS)) 

CC = gcc 
CFLAGS = -Wall --std=c99 -L. 
LIBS = -lm 

all : $(OBJDIR) $(PROG) 

$(PROG) : $(OBJS) 
    $(CC) $(CFLAGS) $^ -o $(PROG) $(LIBS) 

object/%.o : %.c $(HDRS) 
    $(CC) -c $(CFLAGS) $< -o [email protected] $(LIBS) 

$(OBJDIR) : 
    mkdir -p [email protected]/ 

clean: 
    rm -rf object/ 
    rm -f $(PROG) 

メイクファイルは、これらのファイルのすべてと同じディレクトリにあるファイルphysical.oもあり、 。私はmain_prog.oファイルの周りにphysical.oファイルを移動しようとしました(そして対応するようにメイクファイルを変更します)が、私はまだこのエラーが発生します。このエラーに対する解決策は大変感謝しています。

+0

が重複する可能性のようなものとしてそれをリストアップしてみてください[アーキテクチャのための未定義のシンボルのx86 \ _64 Cプログラムをコンパイル中](https://stackoverflow.com/questions/29073978/undefined-symbol-for-architecture-x86 -64-in-compiling-c-program) –

+0

問題は、私のmakefileからオブジェクトリファレンスが欠落していたことでした。 ^問題と同じエラーですが、問題と解決方法は異なります。 –

+0

OK。他の[373件の結果](https://stackoverflow.com/search?q=%5Bc%5D+undefined+symbol+for+architecture+x86_64)のいずれかを試してみてください。 –

答えて

0

あなたのOBJSのmakefile変数にはphysical.oが含まれていないので、実際にはそのオブジェクトファイルにリンクしていません。

OBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(SRCS)) physical.o 
関連する問題