创建一个简单的Makefile来构建共享库

Hom*_*lli 30 gcc makefile shared-libraries

我正在尝试创建一个非常基本的手工制作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)
Run Code Online (Sandbox Code Playgroud)

当我运行时make,它会尝试构建一个应用程序 - 并ld因为无法解决而失败main().

问题似乎与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
Run Code Online (Sandbox Code Playgroud)

这似乎建议只回归-fPIC.

顺便说一下,我的新CFLAGS设置是:

CFLAGS       = -fPIC -shared -pedantic -Wall -Wextra -march=native -ggdb3
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 10.0.4上运行gcc v4.4.3.

Hom*_*lli 27

解决方案是修改XXFLAGS如下:

FLAGS        = # -std=gnu99 -Iinclude
CFLAGS       = -fPIC -g #-pedantic -Wall -Wextra -ggdb3
LDFLAGS      = -shared
Run Code Online (Sandbox Code Playgroud)


Ker*_* SB 15

编译-shared:

gcc -o libfoo.so module1.o module2.o -shared
Run Code Online (Sandbox Code Playgroud)

(这也适用于Windows下的MingW以生成DLL.)

  • 好吧,如果你知道如何编写一个makefile,那么你知道在哪里放置你的编译器选项......`-shared`是一个链接器选项,所以我将它添加到`LDFLAGS`.*编辑*哎呀,你没有*`LDFLAGS`.我建议创建该变量并将其添加到link命令. (2认同)

小智 6

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)
Run Code Online (Sandbox Code Playgroud)