Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLib2&x2B;MSVC:Forking GLib2以使;“轻”;图书馆的版本_C++_Visual Studio 2008_Cmake_Glib - Fatal编程技术网

C++ GLib2&x2B;MSVC:Forking GLib2以使;“轻”;图书馆的版本

C++ GLib2&x2B;MSVC:Forking GLib2以使;“轻”;图书馆的版本,c++,visual-studio-2008,cmake,glib,C++,Visual Studio 2008,Cmake,Glib,我在一个使用VC2008 express编译的私人项目中使用libGTS 短版 libGTS依赖于glib2,而glib2(AFAIK)不能用VC2008编译。我想将glib2的相关部分拉入libGTS并制作一个叉子。解决这个问题的好方法是什么 长版本 为了使用libGTS(最初使用autotools),我已经将其转换为cmake构建系统 不幸的是,libGTS依赖于glib2,glib2依赖于libiconv、libintl、pcre、libFFI(在较新版本中)、pkg-config,其中p

我在一个使用VC2008 express编译的私人项目中使用libGTS

短版

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

长版本

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

不幸的是,libGTS依赖于glib2,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会将文件*之类的内容传递给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,所以这不是问题)。“clean”fork表示外部依赖的最小数量

我曾尝试将glib2的各个部分(单个文件)拉入libgts中的cmake子目录(即包含“glib2lite”库项目的目录),但这并没有真正起作用,因为一个文件通常会拉入其他所有文件。我还成功地生成了libgts的callgraph(以查找实际使用的函数),但最终并没有什么帮助


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

按照函数列表,不要从glib2中提取任何东西,只要自己重新实现它即可(对于类似的程序,我已经多次这样做了。需要注意的是,MSVCRT和glib2中的字符串函数几乎相同,您甚至可以通过
#为它们定义


我现在正在更仔细地研究它们,使用STL和Win32复制函数应该不会超过一两个小时。理解和提取glib2函数需要更长的时间

一些提示:slist在Win32中可用,但对象不同。STL也是如此。您最好直接从libGTS中使用STL


这并不像我最初想象的那么糟糕。你可能可以在一个晚上完成整件事。

GLib与MSVC构建良好,并在最新的tarball中发布其Visual Studio项目文件。有关详细信息,请参阅。

这有多重要?可能有更简单的方法……你考虑过cygwin吗?@MahmoudAl Qudsi:“这有多重要?”为我自己写的私人项目/研究,我绝对不需要glib2带来的所有依赖性。“你考虑过cygwin吗?”“cygwin是一个大数字。代码应该是可移植的,并且使用Qt。让它依赖于类似unix的仿真系统是一个非常糟糕的主意。而且,cl.exe在windows上有更好的编译器性能(根据我的经验)。哦,我同意。这只是一个私人项目是否值得的问题:)@MahmoudAl Qudsi:“是否值得”我不确定。它可能会也可能不会有回报,结果很难预测。然而,用glib来编写“glib2轻量级”应该比自己从头开始编写替换函数更容易。。。我会考虑的。