GLib2+MSVC:分叉 GLib2 以制作"light"版本的库
GLib2+MSVC: Forking GLib2 to make "light" version of the library
我正在使用libGTS在一个使用VC2008 express编译的私人项目中。
短版本
libGTS依赖于glib2,它(AFAIK(不能用VC2008编译。我想将 glib2 的相关部分拉入 libGTS 并进行分叉。解决这个问题的好方法是什么?
长版本
为了使用libGTS(最初使用autotools(,我已经将其转换为cmake构建系统。
不幸的是,libGTS 依赖于 glib2,它依赖于 libiconv、libintl、pcre、libFFI(在较新版本中(、pkg-config,其中 pkg-config 依赖于 glib2。
据我所知,glib2 不能以任何方式使用 VC2008 express 进行编译,因为它需要自动化工具,并且将 Glib2(以及所有依赖项(转换为 cmake 之类的东西会花费太多时间。
到目前为止,我已经使用 mingw 管理构建 glib2,并将 mingw 构建的 glib2与 msvc 构建的 libGTS 链接起来(glib2 有 C 接口,所以这是可能的(,但这在某些情况下会带来问题,因为 glib2 和 libGTS 使用不同的 crt,而 libGTS 将 FILE* 之类的东西传递给 glib2。
幸运的是,libGTS 使用了非常小的一部分 glib2:
g_slist_remove_link
g_list_foreach
g_array_append_vals
g_array_new
g_array_free
g_strdup_vprintf
g_string_free
g_string_new
g_slist_foreach
g_string_insert_c
g_strdup_printf
g_strdup
g_strjoin
g_str_equal
g_str_hash
g_malloc0
g_ptr_array_set_size
g_list_reverse
g_list_length
g_ptr_array_free
g_mem_chunk_destroy
g_ptr_array_remove_index
g_mem_chunk_free
g_mem_chunk_alloc
g_ptr_array_add
g_ptr_array_new
g_mem_chunk_new
g_list_remove_link
g_list_free_1
g_hash_table_lookup
g_malloc
g_free
g_slist_length
g_hash_table_new
g_hash_table_foreach
g_hash_table_remove
g_hash_table_insert
g_hash_table_destroy
g_slist_find
g_slist_remove
g_slist_reverse
g_hash_table_size
g_hash_table_find
g_assertion_message
g_list_last
g_slist_append
g_list_free
g_list_prepend
g_list_append
g_assertion_message_expr
g_slist_free_1
g_node_destroy
g_node_depth
g_slist_concat
g_node_new
g_slist_prepend
g_slist_nth
g_node_prepend
g_slist_free
g_hash_table_foreach_remove
g_log
所以我想将 glib 的相关部分拉入 libGTS,摆脱所有外部依赖项(iconv/libintl - 这个子系统不需要它们(并制作一个"干净"的分支(两个库都是 LGPL,有服务 github/bitbucket,所以这不是问题(。"干净"分叉意味着最少量的外部依赖项。
我尝试将 glib2 的单独部分(单个文件(拉入 libgts 中的 cmake 子目录(即包含"glib2lite"库项目的目录(,但这并没有真正解决,因为一个文件通常最终会拉取其他所有内容。我还设法生成了libgts的调用图(以查找实际使用的函数(,但最终它并没有真正的帮助。
那么解决这个问题的好方法是什么(制作大外部依赖的轻量级版本(?我敢肯定以前有人做过这样的事情。
GLib 使用 MSVC 构建得很好,并在最新的压缩包中发布其 Visual Studio 项目文件。有关更多详细信息,请参阅 GTK+ MSVC wiki 页面。
按照函数列表,不要从 glib2 中提取任何东西 - 只需自己重新实现它(我已经多次为类似的程序这样做了。需要注意的一件事是,MSVCRT 和 glib2 中的字符串函数几乎相同,您甚至可以为此#define
侥幸逃脱(。
我现在正在更仔细地研究它们,使用 STL 和 Win32 复制这些功能应该不会超过一两个小时。理解和提取 glib2 函数需要更长的时间。
一些指针:slist 在 Win32 中可用,但对象不同。与STL相同。你最好直接从libGTS使用STL。
它并不像我最初想象的那么糟糕。你可能在一个晚上把整个事情都搞定了。
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 如何正确实现与基类不同的版本?
- 从预处理器获取 Windows 版本(C++ Win32)
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如何在C++中将 Python 字符串转换为其转义版本?
- GLib2+MSVC:分叉 GLib2 以制作"light"版本的库