vlc 0.8.5 컴파일
하기 DMB
2006/08/18 00:18 |
http://www.videolan.org/vlc/download-sources.html에서
vlc-0.8.5.tar.gz / vlc-0.8.5.tar.bz2 를 다운 받는다.
개발환경 : Microsoft Visual Studio .NET 2003
msvc 디렉토리에 vlc.dsw를 불러온다. 그러면 다이얼로 창이 뜨는데, 난 모두 예를 선택했다.
libvlc.dsp안에 소스 파일이 하나도 없다.
첨부파일에서 libvlc-java2core.dsp -> libvlc.dsp로 복사한다.
libvlc.dsp, vlc.dsp 컴파일
src 디렉토리 밑에 있는 파일을 추가한다. 그리고 컴파일 해 본다.
그럼 무수히 많은 오류들이 발생한다.
error C2061: 구문 오류 : 식별자 'lldiv_t'
error C2079: 'symbols'은(는) 정의되지 않은 struct 'module_symbols_t'을(를) 사용합니다.
error C2065: 'lldiv_t' : 선언되지 않은 식별자입니다.
include\vlc-common.h 파일에서
#if defined(SYS_BEOS)
typedef struct {
long long quot; /*
Quotient. */
long long rem; /* Remainder. */
}
lldiv_t;
# define lldiv vlc_lldiv
VLC_EXPORT( lldiv_t, vlc_lldiv, (
long long numer, long long denom ) );
#elif defined(_MSC_VER)
typedef struct {
int64_t
quot; /* Quotient. */
int64_t rem; /* Remainder. */
}
lldiv_t;
# define lldiv vlc_lldiv
VLC_EXPORT( lldiv_t, vlc_lldiv, (
int64_t numer, int64_t denom ) );
#elif !defined(__PLUGIN__)
#
define vlc_lldiv NULL
#endif
로 변경
error LNK2001: _vlc_lldiv 외부 기호를 확인할 수 없습니다.
src\extras\libc.c
#if defined(SYS_BEOS)
lldiv_t vlc_lldiv( long long numer, long long denom
)
{
lldiv_t d;
d.quot = numer / denom;
d.rem = numer %
denom;
return d;
}
#elif defined(_MSC_VER)
lldiv_t vlc_lldiv( int64_t numer,
int64_t denom )
{
lldiv_t d;
d.quot = numer / denom;
d.rem = numer % denom;
return d;
}
#endif
로 변경 후 컴파일 합니다.
error C2059: 구문 오류 : ':'
src\stream_output\sap.c
#if defined(_MSC_VER)
p_session->i_ttl ? 0
: (config_GetInt( p_sap, "ttl" ) ? 0 :
1),
#else
p_session->i_ttl ?:
(config_GetInt( p_sap, "ttl" ) ?: 1),
#endif
이 파일에서 0.8.6i vs2008환경에서는 조금 다른 에러가 나는데.
HAVE_INET_PTON 를 preprocessor에 넣는다.
프로그램에 따라서
HAVE_INET_PTON
HAVE_INET_NTOP
HAVE_VSNPRINTF 를 몽땅해줘야 되는경우가 종종있다.
error C2010: '.' : 매크로 형식 매개 변수 목록에 사용할 수 없습니다.
include\vlc_interaction.h
#if defined(_MSC_VER)
#define intf_UserFatal( a, c, d, e )
__intf_UserFatal( VLC_OBJECT(a),c,d, e )
#else
#define intf_UserFatal( a,
c, d, e... ) __intf_UserFatal( VLC_OBJECT(a),c,d, ## e
)
#endif
VLC_EXPORT( void, __intf_UserFatal,( vlc_object_t*, const char*,
const char*, ...) );
#if defined(_MSC_VER)
#define intf_UserLoginPassword(
a, b, c, d, e ) __intf_UserLoginPassword(
VLC_OBJECT(a),b,c,d,e)
#else
#define intf_UserLoginPassword( a, b, c, d,
e... ) __intf_UserLoginPassword( VLC_OBJECT(a),b,c,d,e)
#endif
error C2065: 'PACKAGE_VERSION_MAJOR' : 선언되지 않은 식별자입니다.
error
C2065: 'PACKAGE_VERSION_MINOR' : 선언되지 않은 식별자입니다.
error C2065:
'PACKAGE_VERSION_REVISION' : 선언되지 않은 식별자입니다.
error C2065:
'PACKAGE_VERSION_EXTRA' : 선언되지 않은 식별자입니다.
msvc\config.h
/* version minor number */
#define PACKAGE_VERSION_EXTRA ""
/* version major number */
#define PACKAGE_VERSION_MAJOR "0"
/* version minor number */
#define PACKAGE_VERSION_MINOR "8"
/* version minor number */
#define PACKAGE_VERSION_REVISION "5"
error C2275: 'wchar_t' : 이 형식을 식으로 잘못 사용했습니다.
src\misc\unicode.c
#if defined(_MSC_VER)
wide = (wchar_t *)_alloca(len *
sizeof(wchar_t));
#else
wchar_t wide[len];
#endif
error C2057: 상수 식이 필요합니다.
src\misc\unicode.c
#if defined(_MSC_VER)
wchar_t *wmode = (wchar_t *)_alloca(len *
sizeof(wchar_t));
#else
wchar_t wmode[len];
#endif
src\misc\strings.c
#if defined(_MSC_VER)
char *psz_enc = (char *)_alloca(3 * strlen(
psz_url ) + 1), *out = psz_enc;
#else
char psz_enc[3 * strlen( psz_url
) + 1], *out = psz_enc;
#endif
src\misc\charset.c
#if defined(_MSC_VER)
char *dup = (char *)_alloca(strlen( str ) +
1);
#else
char dup[strlen( str ) + 1];
#endif
#if defined(_MSC_VER)
char *dup = (char *)_alloca(strlen( str ) + 1),
*ptr;
#else
char dup[strlen( str ) + 1], *ptr;
#endif
src\input\subtitles.c
#if defined(_MSC_VER)
char *tmp_fname_noext = (char
*)_alloca(strlen( psz_name ) + 1);
char *tmp_fname_trim =
(char *)_alloca(strlen( psz_name ) + 1);
char *tmp_fname_ext
= (char *)_alloca(strlen( psz_name ) + 1);
#else
char
tmp_fname_noext[strlen( psz_name ) + 1];
char
tmp_fname_trim[strlen( psz_name ) + 1];
char
tmp_fname_ext[strlen( psz_name ) + 1];
#endif
#if defined(_MSC_VER)
char *psz_path = (char
*)_alloca(strlen( psz_dir ) + strlen( psz_name ) +
1);
#else
char psz_path[strlen( psz_dir ) + strlen(
psz_name ) + 1];
#endif
error C2143: 구문 오류 : ';'이(가) 'const' 앞에 없습니다.
src\misc\unicode.c
{
#if defined(_MSC_VER)
const char *local_name = ToLocale( filename
);
#endif
...
#if !defined(_MSC_VER)
const char *local_name = ToLocale( filename
);
#endif
error C2065: 'LC_ALL' : 선언되지 않은 식별자입니다.
src\misc\charset.c
#if !defined WIN32
# if HAVE_LANGINFO_CODESET
# include
<langinfo.h>
# else
# if HAVE_SETLOCALE
# include
<locale.h>
# endif
# endif
#elif defined WIN32
# include <windows.h>
# include <locale.h>
#endif
실행파일을 실행하면 이런 오류가 발생합니다.
src\misc\unicode.c에서
#ifdef USE_MB2MB
static char *MB2MB( const char *string, UINT fromCP, UINT
toCP )
{
char *out;
wchar_t *wide;
int len;
len = MultiByteToWideChar( fromCP, 0, string, -1, NULL, 0 );
#if 0
if( len == 0 );
return
NULL;
#else
if( len == 0 )
return
NULL;
#endif
#if defined(_WIN32)
wide = (wchar_t
*)_alloca(len*sizeof(wchar_t));
#else
wchar_t wide[len];
#endif
MultiByteToWideChar( fromCP, 0, string, -1, wide, len );
len =
WideCharToMultiByte( toCP, 0, wide, -1, NULL, 0, NULL, NULL );
if( len ==
0 )
return NULL;
out = malloc( len );
WideCharToMultiByte( toCP, 0, wide, -1, out, len, NULL, NULL );
return out;
}
#endif
로 변경 후 다시 컴파일 한다. 그런 후 실행 시켜보면 오류가 발생하지 않게 된다.
plugin_ipv4.dsp 컴파일
error C2373: 'closesocket' : 재정의. 형식 한정자가 다릅니다.
modules\misc\network\ipv4.c
#if !defined(_MSC_VER)
# define close
closesocket
#endif
plugin_wxwidgets.dsp
plugin_wxwidgets.dsp에
/I "..\modules\gui\wxwidgets" /I "..\..\wxWidgets-2.6.2\include" /I "..\..\wxWidgets-2.6.2\include\msvc" 추가
또는
[속성 페이지] - [C/C++] - [일반] - [추가 포함 디렉토리]에
"..\modules\gui\wxwidgets,..\..\wxWidgets-2.6.2\include,..\..\wxWidgets-2.6.2\include\msvc"를 추가
plugin_wxwidgets.dsp에
/libpath:"..\..\wxWidgets-2.6.2\lib\vc_lib" 추가
또는
[속성 페이지] - [링커] - [일반] - [추가 라이브러리 디렉토리]에
"..\..\wxWidgets-2.6.2\lib\vc_lib"를 추가
error C2057: 상수 식이 필요합니다.
modules\gui\wxwidgets\wxwidgets.hpp
#if defined(_MSC_VER)
char *psz_local = (char
*)_alloca(i + 1);
#else
char psz_local[i + 1];
#endif
error C2664: 'void (update_iterator_t *,char *)' : 매개 변수 2을(를) 'const wxChar *'에서 'char *'(으)로 변환할 수 없습니다.
modules\gui\wxwidgets\dialogs\updatevlc.cpp
if( filedialog->ShowModal() == wxID_OK )
{
update_download( p_uit, (char
*)filedialog->GetPath().mb_str() );
}
error C2010: '.' : 매크로 형식 매개 변수 목록에 사용할 수 없습니다.
modules\gui\wxwidgets\dialogs\infopanels.cpp
#if defined(_MSC_VER)
#define UPDATE( widget,format,
calc ) \
{ \
wxString
formatted; \
formatted.Printf( wxString( wxT(format) ),
calc ); \
widget->SetLabel( formatted );
\
}
#else
#define UPDATE( widget,format, calc... )
\
{ \
wxString
formatted; \
formatted.Printf( wxString( wxT(format) ),
## calc ); \
widget->SetLabel( formatted );
\
}
#endif
error C2664: 'free' : 매개 변수 1을(를) 'const char *'에서 'void *'(으)로 변환할 수 없습니다.
modules\gui\wxwidgets\dialogs\playlist.cpp
wxDnDLocaleFree( (void *)psz_utf8 );
error C2059: 구문 오류 : ':'
modules\gui\wxwidgets\dialogs\wizard.cpp
asprintf( &psz_opt,
":sout=#standard{mux=%s,dst=%s%s%s,access=%s%s}",
mux,
v6 ? "[" : "", address, v6 ? "]" : "", method,
psz_sap_option ? NULL : "" );
error C2440: '=' : 'void *'에서 'user_widget_t ** '(으)로 변환할 수 없습니다.
modules\gui\wxwidgets\dialogs\interaction.cpp
#if defined(_MSC_VER) [출처]
vlc 0.8.5
컴파일 하기|작성자
수신제가
do
{
if(
p_dialog->i_widgets - i - 1 )
{
memmove(
p_dialog->pp_widgets + i,
p_dialog->pp_widgets + i
+ 1,
(p_dialog->i_widgets - i - 1) * sizeof(
*p_dialog->pp_widgets ) );
}
if( p_dialog->i_widgets
> 1 )
{
p_dialog->pp_widgets = (user_widget_t
**)realloc( p_dialog->pp_widgets, (p_dialog->i_widgets - 1) * sizeof(
*p_dialog->pp_widgets ) );
}
else
{
free( p_dialog->pp_widgets );
p_dialog->pp_widgets = NULL;
}
p_dialog->i_widgets--;
}
while( 0 );
#else
REMOVE_ELEM( p_dialog->pp_widgets, p_dialog->i_widgets, i );
#endif