2017-03-20 53 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