linux 的动态库的蛋疼问题

caddor9100 2015-07-14 05:29:46



windows下dll有关键字导出,可linux 没有,

问题来了:


是不是意味着so文件里的任何一个函数都可以被调用者使用?


windows 下是不行的,必须导出!!!!

...全文
244 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiqiang01234 2015-07-15
  • 打赏
  • 举报
回复
引用 8 楼 caddor9100 的回复:
[quote=引用 7 楼 jiqiang01234 的回复:] 不想导出的就不写到头文件中,有什么问题吗?这个原则无论什么系统都成立
你的意思是,导出否,和在头文件里有关系? [/quote] 我的意思是:对于动态库接口的头文件,只写出需要导出的函数。就算其他的函数出现在导出符号表中,但是没有头文件来说明参数类型,也没什么太大意义(破解除外)
赵4老师 2015-07-15
  • 打赏
  • 举报
回复
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George
caddor9100 2015-07-15
  • 打赏
  • 举报
回复
引用 12 楼 mymtom 的回复:
[quote=引用 楼主 caddor9100 的回复:] windows下dll有关键字导出,可linux 没有, 问题来了: 是不是意味着so文件里的任何一个函数都可以被调用者使用? windows 下是不行的,必须导出!!!!
导出根本就是多余,写在DLL里的函数,如果不能被调用,有毛用啊![/quote] 假设一个so里有100个函数, 现在阅读这个so。 阅读人一看便头昏, 它不知道 接口在哪里? 哪个是需要关注的。 比如, 你只导出某几个函数, 人家的注意就会关注导出的哪几个, 其他根本不会关注。 这就是好处。 顺便请教个问题: linux 下是否可导出 变量?
mymtom 2015-07-15
  • 打赏
  • 举报
回复
引用 楼主 caddor9100 的回复:
windows下dll有关键字导出,可linux 没有, 问题来了: 是不是意味着so文件里的任何一个函数都可以被调用者使用? windows 下是不行的,必须导出!!!!
导出根本就是多余,写在DLL里的函数,如果不能被调用,有毛用啊!
mymtom 2015-07-15
  • 打赏
  • 举报
回复
按照C的标准, 函数就是可以被模块调用的,除非用static进行隐藏。 Windows的dll实用export做法才是比较蛋疼的
赵4老师 2015-07-15
  • 打赏
  • 举报
回复
都开源时代了,楼主还在纠结哪些函数该导出,哪些函数不该导出?
LubinLew 2015-07-15
  • 打赏
  • 举报
回复
linux api 去哪里查询资料? http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm
caddor9100 2015-07-15
  • 打赏
  • 举报
回复
引用 7 楼 jiqiang01234 的回复:
不想导出的就不写到头文件中,有什么问题吗?这个原则无论什么系统都成立
你的意思是,导出否,和在头文件里有关系?
jiqiang01234 2015-07-14
  • 打赏
  • 举报
回复
不想导出的就不写到头文件中,有什么问题吗?这个原则无论什么系统都成立
caddor9100 2015-07-14
  • 打赏
  • 举报
回复
引用 5 楼 cjqpker 的回复:
[quote=引用 4 楼 caddor9100 的回复:] [quote=引用 2 楼 cjqpker 的回复:] [quote=引用 楼主 caddor9100 的回复:] windows下dll有关键字导出,可linux 没有, 问题来了: 是不是意味着so文件里的任何一个函数都可以被调用者使用? windows 下是不行的,必须导出!!!!
你说对了,编译时带着头文件,链接时指明需要链接的so文件,就可以了。[/quote] 假设有个so库有3个: a.h b.h c.h a.c b.c c.c 要导出的函数在 c.h c.c中,请问如何写? 不能把a.h /a.c b.h/b.c也导出啊 [/quote] 3楼说的对,你可以按照这种方法,选择性的导出。 如果担心麻烦,那你发布这个so的时候,把c.h 发布出去就可以了,a.h、b.h不发布。[/quote] pthread_mutex_init 问个问题: linux api 去哪里查询资料? man 这个用法我知道,我需要的是 函数索引,目录, 可以看到很多函数的分类,名字, 而不是知道一个函数的名字,然后去man function_name
假正经的班长 2015-07-14
  • 打赏
  • 举报
回复
引用 4 楼 caddor9100 的回复:
[quote=引用 2 楼 cjqpker 的回复:] [quote=引用 楼主 caddor9100 的回复:] windows下dll有关键字导出,可linux 没有, 问题来了: 是不是意味着so文件里的任何一个函数都可以被调用者使用? windows 下是不行的,必须导出!!!!
你说对了,编译时带着头文件,链接时指明需要链接的so文件,就可以了。[/quote] 假设有个so库有3个: a.h b.h c.h a.c b.c c.c 要导出的函数在 c.h c.c中,请问如何写? 不能把a.h /a.c b.h/b.c也导出啊 [/quote] 3楼说的对,你可以按照这种方法,选择性的导出。 如果担心麻烦,那你发布这个so的时候,把c.h 发布出去就可以了,a.h、b.h不发布。
caddor9100 2015-07-14
  • 打赏
  • 举报
回复
引用 2 楼 cjqpker 的回复:
[quote=引用 楼主 caddor9100 的回复:] windows下dll有关键字导出,可linux 没有, 问题来了: 是不是意味着so文件里的任何一个函数都可以被调用者使用? windows 下是不行的,必须导出!!!!
你说对了,编译时带着头文件,链接时指明需要链接的so文件,就可以了。[/quote] 假设有个so库有3个: a.h b.h c.h a.c b.c c.c 要导出的函数在 c.h c.c中,请问如何写? 不能把a.h /a.c b.h/b.c也导出啊
dooX8086 2015-07-14
  • 打赏
  • 举报
回复
gcc 默认是所有都导出 如果不想导出就加 编译时 -fvisibility=hidden 要导出的函数加 __attribute ((visibility("default")))修饰 (跟vc 的 dll 导出修饰符一样用) linux 默认是不会加载当前目录的 so 库. 只会查找 ldconfig 所配置的
假正经的班长 2015-07-14
  • 打赏
  • 举报
回复
引用 楼主 caddor9100 的回复:
windows下dll有关键字导出,可linux 没有, 问题来了: 是不是意味着so文件里的任何一个函数都可以被调用者使用? windows 下是不行的,必须导出!!!!
你说对了,编译时带着头文件,链接时指明需要链接的so文件,就可以了。
赵4老师 2015-07-14
  • 打赏
  • 举报
回复
objdump楼主会用吗?

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧