-1

我在使用 VC2008 express 编译的私有项目中使用 libGTS。

精简版

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-built glib2 与 msvc-built 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 - 这个子系统不需要它们)并制作一个“干净”的 fork(两个库都是 LGPL,有服务 github/ bitbucket,所以这不是问题)。“干净”的分叉意味着最少的外部依赖。

我尝试将 glib2 的单独部分(单个文件)拉入 libgts 中的 cmake 子目录(即包含“glib2lite”库项目的目录),但这并没有真正奏效,因为一个文件通常最终会拉出所有其他文件。我还设法生成了 libgts 的调用图(以查找实际使用的函数),但最终它并没有真正的帮助。

那么解决这个问题的好方法是什么(制作大外部依赖的轻量版)?我敢肯定,以前有人做过类似的事情。

4

2 回答 2

2

GLib 使用 MSVC 构建良好,并在最新的 tarball 中提供其 Visual Studio 项目文件。有关详细信息,请参阅GTK+ MSVC wiki 页面

于 2012-05-10T16:05:41.430 回答
1

按照函数列表,不要从 glib2 中提取任何东西 - 只需自己重新实现它(我已经为类似的程序做过很多次了。需要注意的一点是 MSVCRT 和 glib2 中的字符串函数几乎相同,您甚至可以摆脱#define这些)。

我现在更仔细地研究它们,使用 STL 和 Win32 复制这些功能应该不会超过一两个小时。理解和提取 glib2 函数将花费您更长的时间。

一些提示: slist 在 Win32 中可用,但对象不同。与 STL 相同。直接从 libGTS 中使用 STL 可能会更好。

它并没有我最初想象的那么糟糕。你可能可以在一夜之间完成整个事情。

于 2012-05-10T15:11:42.570 回答