Linux共享对象编译问题

时间:2014-01-09 19:33:28

标签: c linux gcc makefile shared-libraries

我的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的共享对象。因此我将Makefile更改为

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不需要。由于它包含在库中,因此无法查看它。如何继续这个错误。

谢谢,

1 个答案:

答案 0 :(得分:1)

我能够通过几个小调整来使你的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,并结合source1source2规则:

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 $@