makefile
1,是不是可以把Makefile编译脚本整理一下?现在编译打印比较乱,重要信息全部淹没了,而且在linux下编译有很多警告,虽然暂时不影响功能,个人改了一下Makefile脚本,效果如下 CC mov-mvhd.o ........... CC mov-tfdt.o AR libmov.a make ok, output: debug.linux/libmov.a 2,作者是不是在win下开发比较多?,下载了几次,linux下编译不通过,还需要改一下
感谢,方便的话把你的Makefile提个MR?
已在sdk项目中提交,pr通过后,会在media_server,3rd,avcodec中一并提交修改
已合入, 非常感谢!
我也有些关于Makefile的意见, 请问是在这个 issue 合并讨论还是另开 issue.
- 编译出的动态库后缀不对(仍然是.a).
- -fvisibility=hidden 建议暂时关闭, 除非已动态 export 所有对外接口. 静态库使用该参数似乎没啥意义.
- 缺少 make install 功能(不方便cmake工程导入).
- 缺少 soname(对工程导入cmake有一些影响).
- librtsp/source/server/aio 代码没有进入rtsp库编译.
- 增加strip符号表功能
除了第2点fvisibility=hidden的问题, 我不知道作者要export哪些接口, 只是临时关闭了该功能. 其他修改已有补丁. 请问是否需要提个 PR 给你?
欢迎提PR!
其它一些问题:
编译出的动态库后缀不对(仍然是.a).
目前都是已静态库方式提供,哪个项目需要编译动态库?
-fvisibility=hidden 建议暂时关闭, 除非已动态 export 所有对外接口. 静态库使用该参数似乎没啥意义.
-fvisibility=hidden 用于动态库,默认情况下不导出任何函数,除非头文件中定义了visible或者定义map文件。
librtsp/source/server/aio 代码没有进入rtsp库编译.
协议代码默认都不包含网络处理部分, aio代码在test中编译,这是特意设计的。
目前都是已静态库方式提供,哪个项目需要编译动态库?
我个人嵌入式项目想集成作者的媒体库, 习惯性会使用动态库.
-fvisibility=hidden 用于动态库,默认情况下不导出任何函数,除非头文件中定义了visible或者定义map文件。
是的, 我看头文件中也没有设置接口的可见性, 直接编译动态库出来应该没办法使用. 我个人也喜欢默认隐藏所有符号, 手动导出对外API. 因此是否先屏蔽该编译参数, 在所有接口显示设置可见性后才放开该参数. 目前我仅看了mpeg库, 感觉只有mpeg-ts.h和mpeg-ps.h和若干宏是需要导出的, 其他include文件夹下的文件(API)感觉属于内部API.
协议代码默认都不包含网络处理部分, aio代码在test中编译,这是特意设计的。
了解.
我个人嵌入式项目想集成作者的媒体库, 习惯性会使用动态库.
对嵌入式不太了解,如果需要编译动态库,可以参考sdk/libaio的makefile文件, 在这个项目中,使用map文件导出需要的函数。
include $(ROOT)/gcc.mk
CFLAGS += -fvisibility=default
LDFLAGS += -Wl,--version-script=libaio.map
如上,在include gcc.mk文件后,可以修改visibility为default
缺少 make install 功能(不方便cmake工程导入).
想支持cmake编译,但是一直拖延至今,欢迎提交cmake编译脚本。
我个人嵌入式项目想集成作者的媒体库, 习惯性会使用动态库.
对嵌入式不太了解,如果需要编译动态库,可以参考sdk/libaio的makefile文件, 在这个项目中,使用map文件导出需要的函数。
include $(ROOT)/gcc.mk CFLAGS += -fvisibility=default LDFLAGS += -Wl,--version-script=libaio.map如上,在include gcc.mk文件后,可以修改visibility为default
怎么让符号可见, 这个我也略有研究过. 因此想跟您讨论下控制符号导出的方式.
- 一种是像您给的建议, 使用 map 文件控制导出.
- 另一种是在源码头文件中控制导出. 个人项目是封装了如下的宏. 我个人更倾向于使用这种, 在头文件里明确哪些符号是需要导出的. map 文件方式指定整个库是比较方便的, 但是精确到函数写起来就不太友好了, 还不如将其分散到各个库的头文件中. 但是这种做法对现有工程改动量较大, 我个人对mpeg库之外的代码也不是很熟悉, 没办法直接提交有效的补丁. 最偷懒的情况是直接给所有include文件夹下的接口加上导出宏, 但是这样就失去精确控制的意义了.
#if defined _WIN32 || defined __CYGWIN__
#ifdef BUILDING_DLL
#ifdef __GNUC__
#define DLL_PUBLIC __attribute__ ((dllexport))
#else
#define DLL_PUBLIC __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.
#endif
#else
#ifdef __GNUC__
#define DLL_PUBLIC __attribute__ ((dllimport))
#else
#define DLL_PUBLIC __declspec(dllimport) // Note: actually gcc seems to also supports this syntax.
#endif
#endif
#define DLL_LOCAL
#else
#if __GNUC__ >= 4
#define DLL_PUBLIC __attribute__ ((visibility ("default")))
#define DLL_LOCAL __attribute__ ((visibility ("hidden")))
#else
#define DLL_PUBLIC
#define DLL_LOCAL
#endif
#endif
缺少 make install 功能(不方便cmake工程导入).
想支持cmake编译,但是一直拖延至今,欢迎提交cmake编译脚本。
好的, 那我周末弄下. 过程中会有些细节问题想跟您实时交流, 方便留个联系方式吗.