2012-02-11 7 views
3

私はWindows上でVisual Studio 2010を使用しているC++プロジェクトに取り組んでいます。私は奇妙なことは、私のx264のコードが完全時々に動作していることであるMinGWでクロスコンパイルされたlibx264を使用すると奇妙で予測できないクラッシュ

http://www.ayobamiadewole.com/Blog/Others/x264compilation.aspx

のガイド次のMinGWを使用して共有ライブラリとして自分自身を建てx264のに対して動的にリンクしています。それから私は、コードのいくつかの行を変更した場合(あるいはファイルのコメントを変更!)と私はファンキーな何もしていないよラインメッセージ

Access violation reading location 0x00000000 

encoder_ = x264_encoder_open(&param); 

上のすべてのクラッシュを再コンパイル私のコードが間違っているのではないかもしれませんが、リンクに間違ったことがあるか、x264のコンパイル方法に何か問題があります。

完全な初期化コード:

x264_param_t param = { 0 }; 
if (x264_param_default_preset(&param, "ultrafast", "zerolatency") < 0) { 
    throw KStreamerException("x264_param_default_preset failed"); 
} 

param.i_threads = 1; 
param.i_width = 640; 
param.i_height = 480; 
param.i_fps_num = 10; 
param.i_fps_den = 1; 

encoder_ = x264_encoder_open(&param); // <----- 
if (encoder_ == 0) { 
    throw KStreamerException("x264_encoder_open failed"); 
} 

x264_picture_alloc(&pic_, X264_CSP_I420, 640, 480); 

編集:それはそれは常にリリースモードで動作し、超高速の代わりに超高速の使用している場合、それはまた、デバッグモード100%で動作することが判明しました。超高速モードでデバッガが好きではないクレイジーな最適化を行っているのでしょうか?

+0

私たちはHeisenbugを扱っています...幸運。:S –

+0

正確に何がnullであるかを確認するには、デバッガを使用する必要があります。 – Mat

+0

クラッシュはlibx264内にあり、MinGWを使用してビルドされており、MSVCを使用してプロジェクトをビルドしているので、デバッグシンボルはありません。 – Daniel

答えて

1

私はこの問題もlibx264-120で満たしています。 libx264-120は、MinGWと次のような構成オプションで構築されました。

$ ./configureを--disable-cliを--enable-共有--extra-LDFLAGS = -Wl、 - 出力-DEF = libx264-120.def --enable-デバッグ--enable-win32thread

x86のこのプログラムはいつか 成功

#include "stdafx.h" 
#include <iostream> 
#include <cassert> 

using namespace std; 

#include <stdint.h> 
extern "C"{ 
#include <x264.h> 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
int width(640); 
int height(480); 

int err(-1); 

x264_param_t x264_param = {0}; 
//x264_param_default(&x264_param); 

err = 
    x264_param_default_preset(&x264_param, "veryfast", "zerolatency"); 
assert(0==err); 

x264_param.i_threads = 8; 
x264_param.i_width = width; 
x264_param.i_height = height; 
x264_param.i_fps_num = 60;//fps; 
x264_param.i_fps_den = 1; 
// Intra refres: 
x264_param.i_keyint_max = 60;//fps; 
x264_param.b_intra_refresh = 1; 
//Rate control: 
x264_param.rc.i_rc_method = X264_RC_CRF; 
x264_param.rc.f_rf_constant = 25; 
x264_param.rc.f_rf_constant_max = 35; 
//For streaming: 
x264_param.b_repeat_headers = 1; 
x264_param.b_annexb = 1; 

err = x264_param_apply_profile(&x264_param, "baseline"); 
assert(0==err); 

x264_t *x264_encoder = x264_encoder_open(&x264_param); 
x264_encoder = x264_encoder; 


x264_encoder_close(x264_encoder); 

getchar(); 
return 0; 
} 

platform:  X86 
system:  WINDOWS 
cli:   no 
libx264:  internal 
shared:  yes 
static:  no 
asm:   yes 
interlaced: yes 
avs:   yes 
lavf:   no 
ffms:   no 
gpac:   no 
gpl:   yes 
thread:  win32 
filters:  crop select_every 
debug:   yes 
gprof:   no 
strip:   no 
PIC:   no 
visualize:  no 
bit depth:  8 
chroma format: all 

$は-j8

のlib /def:libx264-120.def /マシンを作ります。しかし、アクセス違反でx264_encoder_openで頻繁に失敗します。 この情報はGoogleには存在しません。 x264_param_tの初期化方法とx264_encoder_openの使い方は不明です。

これは動作がx264の設定値に起因するようですが、libx264を使用しているオープンソースプログラムを読まなければこれらを知ることができません。この挙動は

;

そして、このアクセス違反はそうはMinGWののgccでFIRST TIMEの実行にとコンパイルで発生する(./テストなどのgcc -oテストtest.cの-lx264)しません。私は、libx264がMinGWのgcc上に構築されたilbx264のDLLバージョンのリソースのいくつかの奇妙なプロセスを行っていると思います。

0

私は同じ問題がありました。私が修正することができた唯一の方法は、asmオプションなしでx264 dllをビルドすることでした(つまり、--disable-asmを指定してください)。

関連する問題