5

directory1にヘッダーファイルmyheader.hと静的ライブラリlibmylib.aファイルがあります。directory2には、それらを使用するプログラムを書いています。myheader.hとlibmylib.aを使用するmain.cがdirectory2にあるとします。それらをコンパイルしてリンクするためのMakefileを作成するにはどうすればよいですか?

今、私のmain.cに、追加しました

#include "../directory1/myheader.h"

現時点での私のMakefileは次のとおりです。

CC = gcc

INCLUDES = -I

CFLAGS = -g -Wall $(INCLUDES)

main: main.o ../directory1/libmylib.a
    $(CC) main.o ../directory1/libmylib.a -o main

main.o: main.c ../directory1/myheader.h
    $(CC) $(CFLAGS) -c main.c

次の警告が表示されます。

gcc -g -Wall -I -c main.c
/home/me/directory2/main.c:72: undefined reference to `foo'
collect2: ld returned 1 exit status
make: *** [main.o] Error 1

ここで、fooはライブラリ内の関数の1つです。

4

2 に答える 2

6

Ok。修正しました。

削除#include "../directory1/myheader.h"して、に置き換えました#include "myheader.h"

次に、Makefileで、次を使用しました。

CC = gcc

INCLUDES = -I../directory1

CFLAGS = -g -Wall $(INCLUDES)

LDFLAGS = -L../directory1

main: main.o ../directory1/libmylib.a
    $(CC) main.o $(LDFLAGS) -lmylib -o main

main.o: main.c ../directory1/myheader.h
    $(CC) $(CFLAGS) -c main.c
于 2013-02-23T22:06:18.513 に答える
2

使用-lmylibが問題になります。非静的ライブラリの場合、変数LD_LIBRARY_PATHをいじる必要があります。アプリケーションを実行するたびに、エクスポートを使用してLD_LIBRARY_PATHを定義する必要があるのはなぜですか?を参照してください。。を追加することでmakefileを修正できます-L ../directory1。しかし、最も簡単なのは、に置き換えること-lmylibです../directory1/libmylib.a

例えば:

directory1 / mylib.c

#include "../directory1/myheader.h"
void foo(void) {}

directory1 / Makefile

libmylib.a: mylib.o
    ar r $@ $?

directory1 / main.c:

#include "../directory1/myheader.h"
int main(void) {
   foo();
   return 0;
}

directory1 / Makefile

main: main.o ../directory1/libmylib.a
   gcc main.o ../directory1/libmylib.a -o main
于 2013-02-23T21:16:31.887 に答える