我的makefile以前是这样的。
export SOURCE1 = source1.c \
1.c \
2.c \
3.c
export SOURCE2 = source2.c \
1.c
all:
gcc -Wall -W -g -O2 ${SOURCE1} -lm -lipc -o source1
gcc -Wall -W -g -O2 ${SOURCE2} -lm -lipc -o source2
这个很好用。而且,我想创建一个包含1.c、2.c和3.c的共享对象。
export LIB_SOURCE 1.c 2.c 3.c
export SOURCE1 = source1.c
export SOURCE2 = source2.c
all:
gcc -Wall -W -g -O2 ${LIB_SOURCE} -o libsrc.so.1
ln -sf libsrc.so.1 libsrc.so.0
ln -sf libsrc.so.0 libsrc.so
gcc -Wall -W -g -O2 ${SOURCE1} -lm -lipc -lsrc -o source1
gcc -Wall -W -g -O2 ${SOURCE2} -lm -lipc -lsrc -o source2
编译source2时make失败
src.so: undefined reference to 'var1'
var1是在3.c中定义的,这是source2不需要的。因为它被收录在图书馆里,所以没能看出来。如何处理这个错误。
谢谢,
最佳答案
我可以让你的makefile通过一些小的调整来工作:
all:
gcc -Wall -W -g -O2 -shared ${LIB_SOURCE} -o libcsrc.so
gcc -Wall -W -g -O2 -L. ${SOURCE1} -lm -lsrc -o source1
gcc -Wall -W -g -O2 -L. ${SOURCE2} -lm -lsrc -o source2
(我删除了
-lipc
,因为我手头没有那个库。)但我建议在上面的方法完全适合您之后,再使用一种稍微不同的方法。由于您正在构建库libsrc.so
,请为其制定单独的规则,为每个可执行文件制定单独的规则,并使用先决条件列表:all: source1 source2
source1: source1.c libcsrc.so
gcc -Wall -W -g -O2 -L. source1.c -lm -lsrc -o source1
source1: source2.c libcsrc.so
gcc -Wall -W -g -O2 -L. source2.c -lm -lsrc -o source2
libcsrc.so: ${LIB_SOURCE}
gcc -Wall -W -g -O2 -shared ${LIB_SOURCE} -o libcsrc.so
然后您可以输入automatic variables,并组合
source1
和source2
规则:all: source1 source2
source1 source2: % : %.c libcsrc.so
gcc -Wall -W -g -O2 -L. $< -lm -lsrc -o $@
libcsrc.so: ${LIB_SOURCE}
gcc -Wall -W -g -O2 -shared $^ -o $@
关于c - Linux共享对象编译问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21029461/