web-dev-qa-db-ja.com

単純なMakefileを作成して共有ライブラリを構築する

非常に基本的な手作りのMakefileを作成して、共有ライブラリを作成してポイントを説明しようとしています。

これは私がこれまでに持っているものです:

_Shell = /bin/sh
CC    = gcc
FLAGS        = -std=gnu99 -Iinclude
CFLAGS       = -fPIC -pedantic -Wall -Wextra -march=native -ggdb3
DEBUGFLAGS   = -O0 -D _DEBUG
RELEASEFLAGS = -O2 -D NDEBUG -combine -fwhole-program

TARGET  = example.so
SOURCES = $(Shell echo src/*.c)
HEADERS = $(Shell echo include/*.h)
OBJECTS = $(SOURCES:.c=.o)

PREFIX = $(DESTDIR)/usr/local
BINDIR = $(PREFIX)/bin

all: $(TARGET)

$(TARGET): $(OBJECTS)
    $(CC) $(FLAGS) $(CFLAGS) $(DEBUGFLAGS) -o $(TARGET) $(OBJECTS)
_

makeを実行すると、アプリケーションをビルドしようとしますが、main()を解決できないため、ldは失敗します。

問題はCFLAGSにあるようです-_-fPIC_を指定しましたが、機能していません-何が間違っていますか?

編集

提案どおり_-shared_フラグを追加しました。makeを実行すると、このエラーが発生しました。

_gcc -std=gnu99 -Iinclude -fPIC -shared -pedantic -Wall -Wextra -march=native -ggdb3 -O0 -D _DEBUG -o example.so src/example.o
/usr/bin/ld: src/example.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
src/example.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [example.so] Error 1
_

_-fPIC_のみに戻すことを提案しているようです。

ところで、私の新しいCFLAGS設定は次のとおりです。

_CFLAGS       = -fPIC -shared -pedantic -Wall -Wextra -march=native -ggdb3
_

Ubuntu 10.0.4でgcc v4.4.3を実行しています。

30

解決策は、XXFLAGSを次のように変更することでした。

FLAGS        = # -std=gnu99 -Iinclude
CFLAGS       = -fPIC -g #-pedantic -Wall -Wextra -ggdb3
LDFLAGS      = -shared
26

-sharedでコンパイルします:

gcc -o libfoo.so module1.o module2.o -shared

(これはWindowsのMingWでも機能し、DLLを生成します。)

13
Kerrek SB

C++ファイルの例。クリーンターゲットも含まれています

.PHONY : clean

CPPFLAGS= -fPIC -g
LDFLAGS= -shared

SOURCES = $(Shell echo *.cpp)
HEADERS = $(Shell echo *.h)
OBJECTS=$(SOURCES:.cpp=.o)

FIKSENGINE_LIBDIR=../../../../lib
FIKSENGINE_INCDIR=../../../../include

TARGET=$(FIKSENGINE_LIBDIR)/tinyxml.so

all: $(TARGET)

clean:
    rm -f $(OBJECTS) $(TARGET)

$(TARGET) : $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $@ $(LDFLAGS)
5
rgb122

soファイルをビルドしようとするため、おそらく-shared