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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |