我正在尝试在我新安装的Fedora 22上编译一个C语言库作为共享对象。该项目在我的旧版Fedora 20上编译得很好。但现在,当我运行我的makefile时:
CC=gcc
vpath %.c src
vpath %.h inc
CFLAGS = -fPIC
INCLUDE = -Iinc -I/usr/include -I/usr/local/include
LIBPATH = -L/usr/lib -L/lib64
LIBS = -lportaudio -lm -lpthread -ldl
OBJ_PATH = ./objs
SRCS = my_code1.c my_code2.c # etc.
OBJS = $(SRCS:.c=.o)
.PHONY: libmylib.so
all: libmylib.so
debug: $(CFLAGS) += -DDEBUG -O0 -g3 -DPD
debug: all
release: $(CFLAGS) += -DTESTING -O2 -DPD -funroll-loops -fomit-frame-pointer
release: all
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDE) $(LIBPATH) $(LIBS) -c -o $@ $^
libmylib.so: $(OBJS)
$(CC) -shared -Wl,-soname,libmylib.so \
-Wl,--no-undefined $(OBJS) -lc -lportaudio -ldl -lm -lpthread
mv libmylib.so ./bin
mv *.o $(OBJ_PATH)
clean:
rm $(OBJ_PATH)/*.o
rm bin/libmylib.so
我收到很多未定义的引用错误:
my_code1.o: In function `func_in_my_code1':
my_code1.c:(.text+0x1b8): undefined reference to `func_from_my_code2'
my_code2.o: In function `func_in_my_code2':
my_code2.c:(.text+0x310): undefined reference to `func_from_my_func1'
有问题的函数肯定在代码中定义。据推测,这些在编译阶段被编译成.o文件。
完全相同的构建环境适用于我以前的fedora安装。我不知道为什么我应该得到这些错误。
另外,如果我在没有-Wl,--no-undefined
标志的情况下编译,它编译得很好,但是当我尝试从另一个应用程序加载库时,它会抛出同一组未定义的错误。
这可能与Fedora的新版本无关。可能有一些环境变量或某些东西没有通过我的新安装,但我不知道它们可能是什么。
答案 0 :(得分:0)
显然我现在需要在这些函数中插入extern关键字。代码编译完成之前运行良好...我想重申一下,为了后人的缘故,我在我的问题中发布了整个 makefile。