2017-03-20 55 views
1

我對C++ Makefile相當陌生。最近,我嘗試重新實現本文介紹的密集軌跡算法:https://lear.inrialpes.fr/people/wang/dense_trajectories用於C++程序的Makefile不能被正確編譯

但是,我一直在爲Makefile而苦苦掙扎,他們提供了相當長的一段時間。 Makefile文件如下:

# set the binaries that have to be built 
TARGETS := DenseTrack Video 

# set the build configuration set 
BUILD := release 
#BUILD := debug 

# set bin and build dirs 
BUILDDIR := .build_$(BUILD) 
BINDIR := $(BUILD) 

# libraries 
LDLIBS = $(addprefix -l, $(LIBS) $(LIBS_$(notdir $*))) 
LIBS := \ 
    opencv_core opencv_highgui opencv_video opencv_imgproc \ 
    avformat avdevice avutil avcodec swscale 

# set some flags and compiler/linker specific commands 
CXXFLAGS = -pipe -D __STDC_CONSTANT_MACROS -D STD=std -Wall $(CXXFLAGS_$(BUILD)) -I. -I/usr/local/include -I/home/wei/ffmpeg_build/include 
CXXFLAGS_debug := -ggdb 
CXXFLAGS_release := -O3 -DNDEBUG -ggdb 
LDFLAGS = -L/usr/local/lib -L/home/wei/ffmpeg_build/lib -pipe -Wall $(LDFLAGS_$(BUILD)) 
LDFLAGS_debug := -ggdb 
LDFLAGS_release := -O3 -ggdb 

include make/generic.mk 

我可以確認我的opencv2.4.2和ffmpeg5.4.0已成功安裝在Ubuntu 16.04,運行使用這些兩個庫的例子。

對於OpenCV的: 的庫路徑是:在/ usr /本地/ lib中

libavcodec.a     libopencv_gpu.so.2.4 
    libopencv_photo.so.2.4 
libavdevice.a     libopencv_gpu.so.2.4.2  libopencv_photo.so.2.4.2 
libavfilter.a     libopencv_highgui.so   libopencv_stitching.so 
libavformat.a     libopencv_highgui.so.2.4  libopencv_stitching.so.2.4 
libavutil.a     libopencv_highgui.so.2.4.2 libopencv_stitching.so.2.4.2 
libopencv_calib3d.so   libopencv_imgproc.so   libopencv_ts.so 
libopencv_calib3d.so.2.4  libopencv_imgproc.so.2.4  libopencv_ts.so.2.4 
libopencv_calib3d.so.2.4.2  libopencv_imgproc.so.2.4.2 libopencv_ts.so.2.4.2 
libopencv_contrib.so   libopencv_legacy.so   libopencv_video.so 
libopencv_contrib.so.2.4  libopencv_legacy.so.2.4  libopencv_video.so.2.4 
libopencv_contrib.so.2.4.2  libopencv_legacy.so.2.4.2  libopencv_video.so.2.4.2 
libopencv_core.so    libopencv_ml.so    libopencv_videostab.so 
libopencv_core.so.2.4   libopencv_ml.so.2.4   libopencv_videostab.so.2.4 
libopencv_core.so.2.4.2  libopencv_ml.so.2.4.2   libopencv_videostab.so.2.4.2 
libopencv_features2d.so  libopencv_nonfree.so   libpostproc.a 
libopencv_features2d.so.2.4 libopencv_nonfree.so.2.4  libswresample.a 
libopencv_features2d.so.2.4.2 libopencv_nonfree.so.2.4.2 libswscale.a 
libopencv_flann.so    libopencv_objdetect.so  pkgconfig 
libopencv_flann.so.2.4   libopencv_objdetect.so.2.4 python2.7 
libopencv_flann.so.2.4.2  libopencv_objdetect.so.2.4.2 python3.5 
libopencv_gpu.so    libopencv_photo.so 

的包括路徑是:USR /本地/包括:

libavcodec libavfilter libavutil libswresample opencv 
libavdevice libavformat libpostproc libswscale  opencv2 

對於ffmpeg的: 的LIB路徑是:/ home/user/ffmpeg_build/lib

libavcodec.a libavfilter.a libavutil.a libfdk-aac.la libswresample.a libx265.a 
libavdevice.a libavformat.a libfdk-aac.a libpostproc.a libswscale.a  pkgconfig 

包含路徑是:/家庭/用戶/的ffmpeg /包括

fdk-aac  libavdevice libavformat libpostproc libswscale  x265.h 
libavcodec libavfilter libavutil libswresample x265_config.h 

所以,當我的Makefile做到,我沒有錯誤,但它似乎連接是否正常工作,也不是編譯的輸出。

我試着用g ++命令直接編譯。

sudo g++ -o Video -pipe -D __STDC_CONSTANT_MACROS -D STD=std -Wall -I. -I/usr/local/include -O3 -DNDEBUG -ggdb -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_video -lopencv_imgproc -lavformat -lavdevice -lavutil -lavcodec -lswscale *.h Video.cpp 

然而,返回爲錯誤:

/tmp/ccjYmwI4.o: In function `main': 
/home/wei/Documents/dt/dense_trajectory_release_v1.2/Video.cpp:33: undefined reference to `cvCreateFileCapture' 
/home/wei/Documents/dt/dense_trajectory_release_v1.2/Video.cpp:48: undefined reference to `cvQueryFrame' 
/home/wei/Documents/dt/dense_trajectory_release_v1.2/Video.cpp:57: undefined reference to `cvCopy' 
/home/wei/Documents/dt/dense_trajectory_release_v1.2/Video.cpp:60: undefined reference to `cvShowImage' 
/home/wei/Documents/dt/dense_trajectory_release_v1.2/Video.cpp:61: undefined reference to `cvWaitKey' 
/home/wei/Documents/dt/dense_trajectory_release_v1.2/Video.cpp:53: undefined reference to `cvCreateImage' 
/home/wei/Documents/dt/dense_trajectory_release_v1.2/Video.cpp:70: undefined reference to `cvDestroyWindow' 
/home/wei/Documents/dt/dense_trajectory_release_v1.2/Video.cpp:41: undefined reference to `cvNamedWindow' 
collect2: error: ld returned 1 exit status 

我一直在這個問題上了好幾天。任何幫助或建議將非常感激。

感謝

+0

嘗試使用'g ++ Video.cpp -o Video -pipe -D __STDC_CONSTANT_MACROS -D STD = std -Wall -I進行測試。 -I/usr/local/include -O3 -DNDEBUG -ggdb -L ​​/ usr/local/lib -lopencv_core -lopencv_highgui -lopencv_video -lopencv_imgproc -lavformat -lavdevice -lavutil -lavcodec -lswscale'代替。 – user657267

回答

1

的問題來自於你的連接電話:

庫選項(-l)代碼後一定要來編譯或鏈接:

正確:

# code in foo.cpp need function in libmylib.so 
g++ foo.cpp -lmylib 

# code in foo.o need function in libmylib.so 
g++ foo.o -lmylib 

錯誤:

# code in foo.cpp need function in libmylib.so 
g++ -lmylib foo.cpp 

# code in foo.o need function in libmylib.so 
g++ -lmylib foo.o 
+0

謝謝!問題就在於你說了什麼。但是當我有一個可執行文件Video之後,我試圖實現一個例子:./Video video.avi。它說(視頻:31629):GLib-GObject-CRITICAL **:g_object_set:斷言'G_IS_OBJECT(object)'失敗 無法初始化捕獲.. 你知道這意味着什麼嗎? – Wei

+0

「你有什麼想法......」不,請隨時提出一個新問題。 – purplepsycho

+0

感謝您的幫助! – Wei