2013-04-11 87 views
1

我想用CodeBlocks或Linux終端編譯以下OpenCV程序。OpenCV在Linux中使用CodeBlocks編譯Eigenface.cpp

http://plaza.ufl.edu/tyler727/imdl/src/eigenface.cpp

line 57: nTrainFaces = loadFaceImgArray("/home/hacker/data/Eigenfacecpp/train.txt"); 

    line 192: // load test images and ground truth for person number 
      nTestFaces = loadFaceImgArray("/home/hacker/data/Eigenfacecpp/test.txt"); 

    // project the training images onto the PCA subspace 
    projectedTrainFaceMat = cvCreateMat(nTrainFaces, nEigens, CV_32FC1); 
    for(i=0; i<nTrainFaces; i++) 
    { 
     cvEigenDecomposite(faceImgArr[i], 
          nEigens, 
          eigenVectArr, 
          0, 0, 
          pAvgTrainImg, 
line 78:     projectedTrainFaceMat->data.fl + i*nEigens); 
    } 

    cvCalcEigenObjects(nTrainFaces, 
         (void*)faceImgArr, 
         (void*)eigenVectArr, 
         CV_EIGOBJ_NO_CALLBACK, 
         0, 
         0, 
         &calcLimit, 
         pAvgTrainImg, 
line 154:    eigenValMat->data.fl); 

     //project the test image onto the PCA subspace 
     cvEigenDecomposite(faceImgArr[i], 
          nEigens, 
          eigenVectArr, 
          0, 0, 
          pAvgTrainImg, 
line 211:     projectedTestFace); 

,我得到了這些錯誤:

Compiling: eigenface.cpp 

In Function »void learn()«: 
line 57: deprecated conversion from string constant to ‘char*’ [Wwrite-strings] 

In Function »double recognize()«: 
line 192: deprecated conversion from string constant to ‘char*’ [Wwrite-strings] 

/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
obj/Debug/eigenface.o: In function `learn()': 
/home/hacker/data/Eigenfacecpp/eigenface.cpp:78: undefined reference to `cvEigenDecomposite' 

obj/Debug/eigenface.o: In function `doPCA()': 
/home/hacker/data/Eigenfacecpp/eigenface.cpp:154: undefined reference to `cvCalcEigenObjects' 

obj/Debug/eigenface.o: In function `recognize()': 
/home/hacker/data/Eigenfacecpp/eigenface.cpp:211: undefined reference to `cvEigenDecomposite' 

我不明白我做錯了什麼。我認爲這很愚蠢,但我找不到它。

編譯器和代碼塊調試器設置:

鏈接設置 - >其他選項:-lopencv_core -lopencv_objdetect -lopencv_imgproc -lopencv_highgui

搜索Directories->編譯器:/usr/local/include/opencv 搜索Directories->鏈接:/usr/lib

有什麼我在這裏做錯了? 請幫我解決這個問題。

+0

主要定義在哪裏?在另一個文件?雅。那麼這不應該鏈接。你只需編譯這個'-c',然後再鏈接對象'.o'文件。 – 2013-04-11 18:14:58

回答

0
  1. 你的源代碼,不包括main()功能,因此無論是從http://plaza.ufl.edu/tyler727/imdl/src/main.cpp下載main.cpp文件,並把它放在你的項目目錄中,或者取消在eigenface.cpp的main()或者甚至寫自己的main()功能。
  2. 使用opencv的鏈接器選項的完整列表是:-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_ts -lopencv_video -lopencv_videostab當然,您可能不需要所有這些庫,但它不會因爲鏈接器足夠聰明而受到傷害,並且只會包含實際引用的庫。
  3. 在命令行中,您可能會發出g++ main.cpp eigenface.cpp -o eigenface -I/usr/include/opencv -L/usr/lib <all linker flags in "2">/usr/inlude/opencv替換爲包含OpenCV標題的目錄,並將/usr/lib替換爲包含所有庫管理器文件的目錄。如果您使用發行版的軟件包管理器(如apt-get或yum)來安裝OpenCV,這些可能是默認位置。
+0

謝謝Kamyar :) – 2013-04-13 12:42:21

+0

Kamyar你能回答我也請我能做些什麼與字符串常量棄用轉換編譯錯誤: 在功能»無效學()«: 行57:從字符串常量棄用轉換'char *'[Wwrite-strings] In Function»雙重識別()«: 第192行:不推薦將字符串常量轉換爲'char *'[Wwrite-strings] – 2013-04-13 13:32:51

+0

不客氣@NacarAdrianls!對不起,因爲我離開了幾天。如果警告的源頭來自OpenCV(或其他地方)(不在您的控制之列)的(可能是舊的)頭文件,那麼您可以添加以下編譯器'#pragma'來告訴GCC不要使用以下特定類型的警告來警告您: '忽略#pragma GCC診斷「-Wwrite-strings」'。把'#pragma'放在你的代碼的開頭,並且在任何有問題的頭文件的#include之前。 – Kamyar 2013-04-17 18:09:45

0

find/usr/lib -name'libopencv * .so'| xargs readelf -s | egrep「FUNCTION_NAME | libop」 find/usr/lib -name'libopencv * .so'| xargs readelf -s | egrep的 「cvEigenDecomposite | libop」

文件:./libopencv_legacy.so 680:00000000000936f0 1046 FUNC全局默認11 cvEigenDecomposite 所以用 'libopencv_legacy.so'
-lopencv_legacy