user-0 提问: linux 的动态库的蛋疼问题

回复:
user: user-1
content: 引用 8 楼 caddor9100 的回复:[quote=引用 7 楼 jiqiang01234 的回复:] 不想导出的就不写到头文件中，有什么问题吗？这个原则无论什么系统都成立   你的意思是，导出否，和在头文件里有关系？ [/quote] 我的意思是：对于动态库接口的头文件，只写出需要导出的函数。就算其他的函数出现在导出符号表中，但是没有头文件来说明参数类型，也没什么太大意义(破解除外)

user: user-2
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-0
content: 引用 12 楼 mymtom 的回复:[quote=引用 楼主 caddor9100 的回复:]    windows下dll有关键字导出，可linux 没有，  问题来了:   是不是意味着so文件里的任何一个函数都可以被调用者使用？   windows 下是不行的，必须导出！！！！ 导出根本就是多余，写在DLL里的函数，如果不能被调用，有毛用啊！[/quote]  假设一个so里有100个函数，  现在阅读这个so。  阅读人一看便头昏，  它不知道 接口在哪里？  哪个是需要关注的。   比如， 你只导出某几个函数，  人家的注意就会关注导出的哪几个，  其他根本不会关注。  这就是好处。   顺便请教个问题：   linux 下是否可导出 变量？

user: user-3
content: 引用 楼主 caddor9100 的回复:windows下dll有关键字导出，可linux 没有，  问题来了:   是不是意味着so文件里的任何一个函数都可以被调用者使用？   windows 下是不行的，必须导出！！！！ 导出根本就是多余，写在DLL里的函数，如果不能被调用，有毛用啊！

user: user-3
content: 按照C的标准, 函数就是可以被模块调用的，除非用static进行隐藏。 Windows的dll实用export做法才是比较蛋疼的

user: user-2
content: 都开源时代了，楼主还在纠结哪些函数该导出，哪些函数不该导出？

user: user-4
content: linux  api 去哪里查询资料？ http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm

user: user-0
content: 引用 7 楼 jiqiang01234 的回复:不想导出的就不写到头文件中，有什么问题吗？这个原则无论什么系统都成立   你的意思是，导出否，和在头文件里有关系？

user: user-1
content: 不想导出的就不写到头文件中，有什么问题吗？这个原则无论什么系统都成立

user: user-0
content: 引用 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

user: user-5
content: 引用 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不发布。

user: user-0
content: 引用 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也导出啊

user: user-6
content: gcc 默认是所有都导出  如果不想导出就加 编译时 -fvisibility=hidden  要导出的函数加 __attribute ((visibility("default")))修饰   (跟vc 的 dll 导出修饰符一样用)   linux  默认是不会加载当前目录的 so 库. 只会查找  ldconfig 所配置的

user: user-5
content: 引用 楼主 caddor9100 的回复:windows下dll有关键字导出，可linux 没有，  问题来了:   是不是意味着so文件里的任何一个函数都可以被调用者使用？   windows 下是不行的，必须导出！！！！  你说对了，编译时带着头文件，链接时指明需要链接的so文件，就可以了。

user: user-2
content: objdump楼主会用吗？