新聞速報

        

2014年2月27日 星期四

QT 搭配 Libjpeg 的問題

QT 搭配 Libjpeg 的問題
 
QT 是走 C++ 編譯,所以 只要是 C++編譯環境下使用 libjpeg.lib函數庫 都會有相同的問題。
 
由於 libjpeg 是用 C 語言寫的所以,記住一定要用extern包裝起來整個編譯預處理文件,否則在編譯連接的時候就會產生一大堆的link error...。
 
例如: 以下是 QT 搭配 libjpeg 編譯時,產生的錯誤訊息...
 
webcamera_api.o(.text+0x14): In function `write_JPEG_file(char*, int)":
: undefined reference to `jpeg_std_error"
webcamera_api.o(.text+0x2c): In function `write_JPEG_file(char*, int)":
: undefined reference to `jpeg_CreateCompress"
webcamera_api.o(.text+0x4c): In function `write_JPEG_file(char*, int)":
: undefined reference to `jpeg_stdio_dest"
webcamera_api.o(.text+0x8c): In function `write_JPEG_file(char*, int)":
: undefined reference to `jpeg_set_defaults"
webcamera_api.o(.text+0x9c): In function `write_JPEG_file(char*, int)":
: undefined reference to `jpeg_set_quality"
webcamera_api.o(.text+0xa8): In function `write_JPEG_file(char*, int)":
: undefined reference to `jpeg_start_compress"
webcamera_api.o(.text+0xec): In function `write_JPEG_file(char*, int)":
: undefined reference to `jpeg_write_scanlines"
webcamera_api.o(.text+0x104): In function `write_JPEG_file(char*, int)":
: undefined reference to `jpeg_finish_compress"
webcamera_api.o(.text+0x114): In function `write_JPEG_file(char*, int)":
: undefined reference to `jpeg_destroy_compress"
 


 
 
解法:
在自己的 C++ 應用程序,在需要引用函數庫 #include的地方加入
   extern "C" 
   {
   #include "jpeglib.h"
   }

 
 
另一個例子: 
其中 testcamera_2_fb.c 在 GCC 下已經正常編譯且執行正確無誤!!
命令: arm-linux-gcc -o testcamera_2_fb testcamera_2_fb.c -ljpeg
 
現在把 testcamera_2_fb.c 複製成 t1.cpp 並用 G++ 編譯,會發生錯誤。
只要修正 #include 敘述,即可用 G++ 編譯成功。
命令: arm-linux-g++ -o t1 t1.cpp -ljpeg
 
下面程式碼內容完全相同,一個採用 GCC 編譯、另一個採用 G++ 編譯
 
 
PS1: 以上範例在編繹測試之前,就已經完成 libjpeg 函數庫的安裝。
PS2: 編譯前,記得加上 -ljpeg 參數。
PS3: 為什麼 png lib 不需要這樣呢? libpng 自己應該已加了有關的 extern "c" 了.
 

沒有留言:

張貼留言