2012-05-02 3 views
5

며칠 전에 우분투를 설치하고 apt-get을 사용하여 build_essentials, opencv, highgui 등을 설치했습니다. g ++는 4.6.1이고, opencv는 2.1.0 인 것으로 보입니다. 소스에서 opencv를 빌드하십시오.Ububtu, opencv 및 링크

우리는 opencv 기능을 사용하는 소프트웨어가 있습니다. 소스 파일의 이름이 a.cpp와 b.cpp 인 것처럼 가장합니다. 나는 a.o와 b.o로 컴파일 한 다음 그 라이브러리를 .so 라이브러리 (libab.so라고 부른다)에 넣는다.

마지막으로 main이있는 파일이 있습니다 (z.cpp라고 함). 나는 그것으로부터 실행 파일을 만들려고 노력하지만, 나는 cv :: stuff에 "정의되지 않은 참조"에러를 많이 흘린다. 내 링크 라인은 다음과 같은 :

g++ -fPIC -g z.cpp -L../lib -lab -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out 

다음 내가 (물건 :: 이력서에있는 모두가) 정의되지 않은 참조 오류를 얻을.

흥미로운 부분은 내가 .o 파일과 직접 연결하면 괜찮습니다. 이렇게 :

g++ -fPIC -g z.cpp a.o b.o -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out 

작품입니다.

내가 읽은 모든 것은 이것이 링크 줄 정렬 문제 일 가능성이있는 것으로 보이지만 모든 순열을 시도하고 같은 문제가 발생하므로 실제로 내 문제는 아니라고 생각합니다. 여전히 틀리다. 누구나 내 라이브러리로 빌드 할 수있는 방법과 라이브러리에있는 .o 파일의 전체 세트를 사용하여 빌드하면 라이브러리 자체로 빌드 할 수 없는데 왜 다르게 작동하는지 아이디어가 있습니다.

+0

이 좋아, 그래서이 ISN :

이 파일

/usr/local/lib/pkgconfig/opencv.pc 모든 컴파일에 대한 관련 정보를 포함 정말로 "해결책"은 아니지만 소스에서 opencv 2.3.1을 설치하는 일이 끝났습니다. 또한 ffmpeg (특히 v0.8!)를 설치해야했지만 이제는 모든 것이 작동합니다. 그래서, 분명히 apt-get로 얻은 opencv 빌드와 관련이 있습니다. 나는 이것을 시도하지 않았지만 나는 소스에서 2.1을 설치할 수 있었을 것이라고 생각했다. 아직도 라이브러리와 컴파일하는 이유는 확실하지 않습니다.O가 문제가 될 수 있지만 지금은 일하고 있습니다. 따라서 ... – daroo

답변

3

오래된 C 라이브러리와 연결되어있는 것처럼 보입니다. 현재의 OpenCV 링크 명령은 다음과 같습니다 : -lopencv_core -lopencv_flann -lopencv_highgui....

보통 순서가 중요하므로 먼저 모듈을 잊어 버리지 않도록 알파벳 순서를 따르십시오.

- 편집 -

당신이 OpenCV의 libs와 후 - 연구소를 넣어하려고 했습니까? 이것은 라이브러리가 명령 행의 순서로 링크되기 때문에 트릭을 수행 할 수 있습니다. 예를 들어

`pkg-config --libs opencv` 

:

g++ myprogram.cpp `pkg-config --libs opencv` -o myprogram 

PKG-설정은 컴파일러에 당신을위한 라이브러리에 대한 정보를 제공

+0

opencv2.1.0에 대한 것입니까? 나는 그것들을 변경했다는 것을 알고 있지만, "pkg-config opencv --libs"에서 lib 디렉토리를 얻었으므로, 그것들은 올바른 라이브러리라고 가정한다. 또한 .o 파일과 링크 할 때 링크가 잘되어있어 바로 될거야. 새로운 방법으로 명명 된 libs의 존재를 확인하겠습니다. – daroo

+0

실제 프로덕션 릴리스는 2.3.x이고 2.4.0은 베타 버전입니다. 우분투는 버전에 꽤 늦은 것 같습니다. 어쨌든, 내가 기억할 수있는 한, 새로운 모듈이 시간에 따라 추가 되더라도 libopencv_core, libopencv_highui, libopencv_imgproc ...은 2.x 릴리즈에서이 이름 패턴을가집니다. – sansuiso

+0

흥미 롭 .. "libopencv *"라는 파일이 없습니다./usr/lib에있는 파일의 이름은 "libcv.so.2.1.0" "libcvaux.so.2.1.0"등입니다.이 시점에서 나는 2.3.x를 가져와 소스에서 빌드하고 if에서 빌드 할 수 있습니다. if 도움이됩니다. 이것은 opencv 문제처럼 보이지는 않습니다. 내 소스에서 빌드 된 .so 파일보다는 내 소스에서 .o 파일로 링크 할 때 잘 만들 수 있다는 점을 감안하면. – daroo

12

당신은 g ++ 다음 플래그를 전달할 수 있습니다.

당신은 볼 수 있습니다 :

prefix=/usr/local 
exec_prefix=${prefix} 
libdir=${exec_prefix}/lib 
includedir_old=${prefix}/include/opencv 
includedir_new=${prefix}/include 

Name: OpenCV 
Description: Open Source Computer Vision Library 
Version: 2.3.1 
Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann 
Cflags: -I${includedir_old} -I${includedir_new} 
+1

그건 정확히 내가 뭘했는지, 왜 내가 opencv 또는 라이브러리 명명 문제라고 생각하지 않는지입니다. 나는 명확성을 위해 나의 포스트에서 그것을 보여주지 않았지만 pkg-config에서 libs를 직접 얻었으므로 정확한 것을 사용하고 있었다. 나는 원래의 질문에 "해결"에 대한 의견을 추가 할 것입니다. – daroo