GLib2 + MSVC:将GLib2分叉以制作库的“轻型”版本

时间:2012-05-10 14:03:23

标签: c++ visual-studio-2008 cmake glib

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

简短版

libGTS依赖于glib2,其中(AFAIK)无法用VC2008编译。我想将glib2的相关部分拉入libGTS并制作一个fork。解决这个问题的好方法是什么?

长版

为了使用libGTS(最初使用autotools),我已经将它转换为cmake构建系统。

不幸的是,libGTS依赖于glib2,它依赖于libiconv,libintl,pcre,libFFI(在较新的版本中),pkg-config,其中pkg-config依赖于glib2。即循环依赖。

据我所知,glib2无法以任何方式使用VC2008 express编译,因为它需要自动工具,并且将Glib2(和所有依赖项)转换为像cmake这样的东西会花费太多时间来满足我的喜好。

到目前为止,我使用mingw管理构建glib2,并使用msvc构建的libGTS链接mingw构建的glib2(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,所以这不是问题)。 “clean”fork意味着最少量的外部依赖。

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

那么解决这个问题的好方法是什么(制作大型外部依赖的轻量级版本)?我确定之前有人这样做过。

2 个答案:

答案 0 :(得分:1)

按功能列表进行操作,不要从glib2中取出任何东西 - 只需自己重新实现(我已经在很多场合为类似程序做过。有一点需要注意的是,字符串在MSVCRT和glib2几乎完全相同,你甚至可以使用#define来逃避。

我现在正在仔细研究它们,使用STL和Win32来复制这些功能不应该花费一两个多小时。理解和提取glib2函数需要花费更长的时间。

一些指示:在Win32中可以使用slist,但对象不同。与STL相同。你可能最好直接从libGTS使用STL。

它没有我最初认为的那么糟糕。你可能会在一个晚上把整个事情拉下来。

答案 1 :(得分:1)

GLib使用MSVC构建良好,并将Visual Studio项目文件发布到最新的tarball中。有关详细信息,请参阅the GTK+ MSVC wiki page