【发布时间】:2016-03-02 22:50:32
【问题描述】:
我正在尝试在我新安装的 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 的新版本无关。可能有一些环境变量或某些东西没有通过我的新安装,但我不知道它们可能是什么。
【问题讨论】:
-
显然你没有发布实际的makefile。无法为您提供帮助。
-
您的帖子中几乎没有足够的信息来帮助您一点,粘贴完整的 makefile 将是朝着正确方向迈出的一步,正如@iharob 已经提到的那样。我怀疑您使用的
Fedora版本是问题的原因,但实际上,我无法确定... -
我发布了整个makefile。我更改了文件、函数等的名称以保护无辜者。有几十个源代码文件,几千行代码。我认为上传整个项目并不实用。是否清楚其他文件中引用的函数是未定义引用的原因?我不知道要提供什么其他信息——我求助于 stackoverflow 的部分原因。
标签: c makefile shared-libraries fedora