我正在尝试在新安装的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无关。可能有一些环境变量或某些没有通过我的新安装完成的变量,但我不知道它们可能是什么。

最佳答案

显然我现在需要将extern关键字插入这些函数中。该代码在此之前已编译并完美运行。。。为了后代,我想重申一下,我确实将整个makefile发布到了问题中。

关于c - fedora 22链接共享对象时出现多个未定义的引用错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33979338/

10-11 21:06