c - Linux共享对象编译问题

标签 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 不需要。由于它包含在库中,因此看不到它。如何继续处理此错误。

谢谢,

最佳答案

我能够让你的 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 $@

关于c - Linux共享对象编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029461/

相关文章:

c - 从函数返回数组地址无效

php - exec() 什么都不做

c++ - g++ 处理复制 std::complex

c - 从 C 中用空格分隔的文件中读取两个字符串

c - 如何在 C S-Function 之间共享 C 结构?

java - 序列化要由 Java 等反序列化的 C 结构的最佳方法

c - 修改动态分配的 char* 二维数组的函数

linux - 如何将 avprobe 的输出重定向到文件?

linux - 如何将默认文档根目录 (www) 和 cgi-bin 更改为主目录?

c - 在MAKE文件: error showing no such file or directory中