본문 바로가기

How to Build

vlc 0.8.5 컴파일.

vlc 0.8.5 컴파일 하기 DMB

2006/08/18 00:18

복사 http://blog.naver.com/java2core/90007470852

첨부파일 (2)

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)
    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