2012-05-10 1 views
-1

저는 VC2008 express를 사용하여 컴파일 된 개인 프로젝트에서 libGTS를 사용하고 있습니다.GLib2 + MSVC : 라이브러리의 "light"버전을 만들기 위해 GLib2를 실행하십시오.

짧은 버전

libGTS는 (AFAIK) VC2008 컴파일 할 수 없다 glib2에 의존한다. glib2의 관련 부분을 libGTS로 가져 와서 포크를 만들고 싶습니다. 이 문제에 접근하는 좋은 방법은 무엇입니까?

긴 버전 이미 cmake 빌드 시스템으로 변환 한 (원래 autotools를 사용) libGTS를 사용하려면

.

불행히도 libGTS는 libiconv, libintl, pcre, libFFI (최신 버전), pkg-config에 의존합니다. 여기서 pkg-config는 glib2에 의존합니다. 나는. 순환 종속성.

내가 알 수있는 한, glib2는 자동 도구가 필요하고 Glib2 (및 모든 종속성)를 cmake와 같은 것으로 변환하기 때문에 VC2008 표현을 사용하여 컴파일 할 수 없습니다.

지금까지 mingw를 사용하여 glib2 빌드를 관리하고 msvc 빌드 lib12와 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 

그래서 나는 모든 외부 종속성 (의 iconv/libintl은 제거, libGTS에 입심의 관련 부분을 끌어 싶습니다 -이 서브 시스템은하지 않습니다 그들을 필요로합니다) 그리고 "깨끗한"포크를 만드십시오 (두 라이브러리 모두 LGPL입니다, github/bitbucket 서비스가 있으므로 문제는 아닙니다). "깨끗한"포크는 최소한의 외부 종속성을 의미합니다.

libgts (즉, "glib2lite"라이브러리 프로젝트가 들어있는 디렉토리)의 cmake 하위 디렉토리에 glib2 (개별 파일)의 개별 부분을 가져 오려고했지만 일반적으로 하나의 파일이 모든 것을 꺼내기 때문에 실제로 작동하지 않습니다. 그밖에. 나는 또한 libgts의 callgraph를 생성 해 냈지만 (실제로 사용되는 함수를 찾으려고), 결국에는 도움이되지 못했다.

그래서이 문제에 접근하는 좋은 방법은 무엇입니까? (큰 외부 종속성의 밝은 버전 만들기) 나는 누군가가 전에 그런 것을했다고 확신한다.

+0

얼마나 중요합니까? 이 문제를 해결하는 데 더 쉬운 방법이있을 것입니다 ... Cygwin을 고려해 보셨습니까? –

+0

@ MahmoudAl-Qudsi : "이게 얼마나 중요합니까?" 개인 프로젝트/연구, 나 자신을위한 글쓰기, 필자는 glib2가 가져 오는 모든 의존성을 필요로하지 않는다. "Cygwin을 고려해 보셨습니까?"Cygwin은 큰 NO입니다. 코드는 이식성이 있어야하며 Qt를 사용합니다. 유닉스 계열 에뮬레이트 된 시스템에 의존하는 것은 매우 나쁜 생각이다. 또한, cl.exe 내 경험에 따르면 Windows에서 더 나은 컴파일러 성능을 가지고 있습니다. – SigTerm

+0

오, 그렇습니다. 개인 프로젝트에 가치가 있는지 없는지의 문제 :) –

답변

1

glib2에서 아무것도 가져 오지 말고 그냥 직접 구현하십시오. (필자는 유사한 프로그램을 여러 번 해 보았습니다. 한가지주의해야 할 점은 MSVCRT의 문자열 함수 그리고 glib2는 거의 동일합니다. 심지어 이것들은 #define으로도 벗어날 수 있습니다).

필자는 더 자세히 살펴보고 기능을 복제하기 위해 STL 및 Win32를 사용하는 데 1 ~ 2 시간이 걸리지 않아야합니다. glib2 기능을 이해하고 추출하는 데 훨씬 오래 걸릴 것입니다.

일부 포인터 : slist는 Win32에서 사용할 수 있지만 개체가 다릅니다. STL과 동일합니다. 아마도 libGTS에서 직접 STL을 사용하는 것이 나을 것입니다.

처음에는 생각했던 것처럼 나쁘지 않습니다. 어느 날 밤에 모든 것을 꺼낼 수 있습니다.

+0

"그리고 한 두 시간 이상 걸리지 않을 것입니다."흠 ... 나는 그것에 대해 생각할 것입니다. – SigTerm

1

GLib는 MSVC로 잘 빌드되고 최신 타르볼에 Visual Studio 프로젝트 파일을 제공합니다. 자세한 내용은 the GTK+ MSVC wiki page을 참조하십시오.

관련 문제