加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 链接时图书馆依赖性如何发挥作用?

发布时间:2020-12-16 06:55:37 所属栏目:百科 来源:网络整理
导读:我有一个库libmya.so和一个库libmyb.so. libmyb.so中的函数依赖于libmya.so中的函数.我还有一个可执行的myexe,它取决于libmyb.so.当我创建这些库时,我应该在哪些规则中放置-l选项? 应该是1): libmya.so: $(OBJ_FILES) $(CPP) $(LDFLAGS) -o $@ $^libmyb.so
我有一个库libmya.so和一个库libmyb.so. libmyb.so中的函数依赖于libmya.so中的函数.我还有一个可执行的myexe,它取决于libmyb.so.当我创建这些库时,我应该在哪些规则中放置-l选项?

应该是1):

libmya.so: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) -o $@ $^

libmyb.so: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) $(LIBS) -o $@ $^ -lmya

myexe: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) $(LIBS) -o $@ $^ -lmyb

或2)

libmya.so: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) -o $@ $^

libmyb.so: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) $(LIBS) -o $@ $^

myexe: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) $(LIBS) -o $@ $^ -lmya -lmyb

还是其他一些组合?

解决方法

我会选择选项1(虽然选项2有效,但我不推荐它,因为任何链接exe的人都需要记住所需的所有传递库).

但是,这个建议仅用于制作一个so文件,就像你上面做的那样.所以文件(共享对象)是“智能”库,很像可执行文件,除了它们没有main.所以文件可以链接到其他库(如可执行文件),当可执行文件链接到so文件时,它会自动递归地包含so文件的依赖项.

因此,您创建的so文件应与其所有依赖项链接.

“哑”库,例如文件(静态库)是一个不同的故事;那么你需要在可执行文件中进行所有链接(选项2).

我建议你使用ldd工具来调查可执行文件和so文件的依赖关系,看看它是如何工作的.

有关为什么选项1更好的实际示例,请尝试使用ldd /usr/lib/libpng.so.请注意,libpng与libz链接.如果不是,那么任何与libpng链接的人都需要链接libz.实际上,您可以在不知道涉及libz的情况下链接libpng.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读