Gcc 创建简单的Makefile以构建共享库

Gcc 创建简单的Makefile以构建共享库,gcc,makefile,shared-libraries,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

我试图创建一个非常基本的手工制作的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
时,它试图构建一个应用程序,
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
这似乎建议只恢复到
-fPIC

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

CFLAGS       = -fPIC -shared -pedantic -Wall -Wextra -march=native -ggdb3

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

使用
-shared
编译:

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

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

由于您尝试构建
so
文件,您可能需要
-shared
解决方案是修改XXFLAGS,如下所示:

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

<> 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)

这是so文件的转到生成文件规则:

%.so: %.o ; $(LINK.c) $(LDFLAGS) -shared $^ -o $@
可以这样使用吗

CFLAGS+=-fPIC

libmyfoo.so:  # create from libmyfoo.o

# or 

libmyfoo.so: myfoo.o  # create from myfoo.o 

我认为您在
CFLAGS
中缺少了
-shared
,而
ld
试图以这种方式创建一个可执行文件。我会使用
$(通配符src/*.c)
而不是
$(shell echo src/*.c)
,但我想知道是否有任何严重的区别。这个问题的更合适的标题是“创建共享库-这些编译和链接选项有什么问题?“您认为这是makefile的一个问题,但它没有任何问题。它完全满足了您的要求。请检查链接。如果您知道如何编写makefile,那么您就知道在哪里放置编译器选项
-shared
是一个链接器选项,因此我将它添加到
LDFLAGS
中。编辑哎呀,你没有
LDFLAGS
。我建议创建该变量并将其添加到link命令中。