1

BPG は、jpeg よりも圧縮効率の高いデジタル画像形式です。OS X 10.10.5 (14F1509)でlibbpg-0.9.6をコンパイルしたかったのです。Xcode のバージョンは7.2.1 (7C1002) です。

$gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents 
/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix

必要なすべてのライブラリ (参照: github.com/mirror/libbpg) がインストールされています。make を実行すると、次のエラーが表示されます。

gcc -Os -Wall -MMD -fno-asynchronous-unwind-tables -fdata-sections -ffunction-sections -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -fomit-frame-pointer -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_REENTRANT -I. -DCONFIG_BPG_VERSION=\"0.9.6\" -g -I./x265/source -I./x265.out/8bit -c -o x265_glue.o x265_glue.c
g++ -g -Wl,-dead_strip -o bpgenc bpgenc.o x265_glue.o x265.out/8bit/libx265.a x265.out/10bit/libx265.a x265.out/12bit/libx265.a  -lpng -ljpeg  -lm -lpthread
gcc -Os -Wall -MMD -fno-asynchronous-unwind-tables -fdata-sections -ffunction-sections -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -fomit-frame-pointer -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_REENTRANT -I. -DCONFIG_BPG_VERSION=\"0.9.6\" -g -c -o bpgview.o bpgview.c
gcc -g -Wl,-dead_strip -o bpgview bpgview.o libbpg.a -lSDL_image -lSDL  -lm -lpthread
ld: entry point (_main) undefined. for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [bpgview] Error 1

bpgview.o のシンボルを確認しました。int mainだけでなく、 bpgview.c のstatic void helpstatic void set_caption表示されませんでした。

$nm bpgview.o
             U _IMG_Load
             U _SDL_AddTimer
             U _SDL_CreateRGBSurface
             U _SDL_EnableKeyRepeat
             U _SDL_FillRect
             U _SDL_Flip
             U _SDL_FreeSurface
             U _SDL_GetVideoInfo
             U _SDL_Init
             U _SDL_LockSurface
             U _SDL_MapRGB
             U _SDL_PushEvent
             U _SDL_RemoveTimer
             U _SDL_SetVideoMode
             U _SDL_UnlockSurface
             U _SDL_UpperBlit
             U _SDL_WM_SetCaption
             U _SDL_WaitEvent
 00000000000006f6 T _SDL_main
             U ___snprintf_chk
             U ___stack_chk_fail
             U ___stack_chk_guard
             U ___stderrp
             U _bpg_decoder_close
             U _bpg_decoder_decode
             U _bpg_decoder_get_frame_duration
             U _bpg_decoder_get_info
             U _bpg_decoder_get_info_from_buf
             U _bpg_decoder_get_line
             U _bpg_decoder_open
             U _bpg_decoder_start
0000000000000000 T _bpg_load
0000000000000404 T _center_image
0000000000000465 T _draw_image
             U _exit
             U _fclose
             U _fopen
             U _fprintf
             U _fread
             U _free
             U _fseek
             U _ftell
             U _fwrite
             U _getopt
000000000000021f T _load_image
             U _malloc
0000000000000c64 t _open_window
             U _optind
000000000000069a T _pan_image
             U _printf
             U _realloc
00000000000003c6 t _restart_frame_timer
0000000000000cbc t _timer_cb

make の完全な出力は、pastebin にあります。

非常に奇妙だと思いますが、コンパイラが関数を無視できるようにする、私が知らないgccオプションがいくつかあるかもしれません。お時間をいただきありがとうございます。

4

1 に答える 1

0

-e _SDL_mainエントリポイントが見つからないという問題を解決したことがわかりました。これは最初は奇妙に思えますが、コンパイラがジェットの代わりに未知の理由でこのシンボルを使用したことが判明しました_main

逆アセンブルされたオブジェクト ファイルは、動作するバイナリと同様に証明されます: ( https://ptpb.pw/6kev.png )

_help と _set_caption が欠落しているのは、-Osサイズを最適化するオプションによるものです。

于 2016-02-13T15:45:39.997 に答える