GLib2+MSVC:分叉 GLib2 以制作"light"版本的库



我正在使用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。

它并不像我最初想象的那么糟糕。你可能在一个晚上把整个事情都搞定了。

相关内容

最新更新