【问题标题】:Makefile: build of c++ file on linux, unable to locate cuda libraries in opencv 2.4.6Makefile:在 linux 上构建 c++ 文件,无法在 opencv 2.4.6 中找到 cuda 库
【发布时间】:2014-04-30 01:29:02
【问题描述】:

希望有人可以帮助解决这个问题。

在 Linux 上使用 Cuda Toolkit 5.5 重建 OpenCV 2.4.6 后,尝试使用 via make 和 CLI g++ 命令构建引用 OpenCV 和 CUDA 的单个 c++ 文件。每种方法的输入和输出如下所示。

Makefile 尝试从 OpenCV 引用 *.a 文件,但不成功。 CLI g++ 命令尝试引用 *.so 文件,它似乎会这样做,但是,某些方法似乎未定义。

Makefile 是否必须只访问 OpenCV *.a 文件?

生成文件:

CFLAGS = -g Wall 
LIBPATH = /data/content/cuda/opencv-2.4.6/lib
LIBS = -lopencv_calib3d_pch_dephelp -lopencv_contrib_pch_dephelp -lopencv_core_pch_dephelp -lopencv_features2d_pch_dephelp -lopencv_flann_pch_dephelp -lopencv_gpu_pch_dephelp -lopencv_haartraining_engine -lopencv_highgui_pch_dephelp -lopencv_imgproc_pch_dephelp -lopencv_legacy_pch_dephelp -lopencv_ml_pch_dephelp -lopencv_nonfree_pch_dephelp -lopencv_objdetect_pch_dephelp -lopencv_perf_calib3d_pch_dephelp -lopencv_perf_core_pch_dephelp -lopencv_perf_features2d_pch_dephelp -lopencv_perf_gpu_pch_dephelp -lopencv_perf_highgui_pch_dephelp -lopencv_perf_imgproc_pch_dephelp -lopencv_perf_nonfree_pch_dephelp -lopencv_perf_objdetect_pch_dephelp -lopencv_perf_photo_pch_dephelp -lopencv_perf_stitching_pch_dephelp -lopencv_perf_superres_pch_dephelp -lopencv_perf_video_pch_dephelp -lopencv_photo_pch_dephelp -lopencv_stitching_pch_dephelp -lopencv_superres_pch_dephelp -lopencv_test_calib3d_pch_dephelp -lopencv_test_contrib_pch_dephelp -lopencv_test_core_pch_dephelp -lopencv_test_features2d_pch_dephelp -lopencv_test_flann_pch_dephelp -lopencv_test_gpu_pch_dephelp -lopencv_test_highgui_pch_dephelp -lopencv_test_imgproc_pch_dephelp -lopencv_test_legacy_pch_dephelp -lopencv_test_ml_pch_dephelp -lopencv_test_nonfree_pch_dephelp -lopencv_test_objdetect_pch_dephelp -lopencv_test_photo_pch_dephelp -lopencv_test_stitching_pch_dephelp -lopencv_test_superres_pch_dephelp -lopencv_test_video_pch_dephelp -lopencv_ts_pch_dephelp -lopencv_video_pch_dephelp -lopencv_videostab_pch_dephelp -lopencv_gpu -lopencv_highgui
INCLUDEPATH1 = /usr/include/opencv2/core
INCLUDEPATH2 = /usr/include/opencv2/highgui 
INCLUDEPATH3 = /usr/include/opencv2/gpu 

all: tiff2png1.so

tiff2png1.so: main.o 
    g++ -o tiff2png1.so main.o  **-L $(LIBPATH) $(LIB)**

main.o: main.cpp 
    g++ -c main.cpp -g -Wall -I $(INCLUDEPATH1)  -I $(INCLUDEPATH2)  -I $(INCLUDEPATH3) $(LIBPATH)

.PHONY: clean
clean:
    rm -vf tiff2png1.so *.o

Makefile 输出:

g++ -o tiff2png1.so main.o -L /data/content/cuda/opencv-2.4.6/lib main.o:在函数main': /home/.../main.cpp:13: undefined reference tocv::gpu::getCudaEnabledDeviceCount()' /home/.../main.cpp:15: 未定义引用 cv::gpu::getDevice()' /home/.../main.cpp:21: undefined reference tocv::imread(std::basic_string, std::allocator > const&, int)' /home/.../main.cpp:27: 未定义引用cv::gpu::GpuMat::GpuMat(cv::Mat const&)' /home/.../main.cpp:29: undefined reference tocv::gpu::Stream::Null()' /home/.../main.cpp:29: 未定义引用cv::gpu::resize(cv::gpu::GpuMat const&, cv::gpu::GpuMat&, cv::Size_<int>, double, double, int, cv::gpu::Stream&)' /home/.../main.cpp:42: undefined reference tocv::Mat::Mat(cv::gpu::GpuMat const&)' /home/.../main.cpp:49: 未定义引用cv::_InputArray::_InputArray(cv::Mat const&)' ... main.o: In function~GpuMat': /usr/include/opencv2/core/gpumat.hpp:374: 未定义引用`cv::gpu::GpuMat: :发布()' collect2: ld 返回 1 个退出状态 make: * [tiff2png1.so] 错误 1

命令行构建

$ g++ -o tx.exe main.o -L/data/content/cuda/opencv-2.4.6/lib -lopencv_gpu

命令行构建输出

/data/content/cuda/opencv-2.4.6/lib/libopencv_gpu.so: undefined reference 到 `cv::gpu::convertTo(cv::gpu::GpuMat const&, cv::gpu::GpuMat&, double, double, CUstream_st*)'

/data/content/cuda/opencv-2.4.6/lib/libopencv_gpu.so:未定义引用`cv::gpu::setTo(cv::gpu::GpuMat&, cv::Scalar_, cv:: gpu::GpuMat const&, CUstream_st*)'

/data/content/cuda/opencv-2.4.6/lib/libopencv_gpu.so:未定义对 `cv::gpu::setTo(cv::gpu::GpuMat&, cv::Scalar_, CUstream_st*) 的引用'

collect2: ld 返回 1 个退出状态

【问题讨论】:

    标签: linux opencv cuda makefile


    【解决方案1】:

    看起来您可能在链接器目标中的变量末尾省略了一个“S”

    **LIBS** = -lopencv_calib3d_pch_dephelp ...
    
    tiff2png1.so: main.o 
        g++ -o tiff2png1.so main.o  -L $(LIBPATH) $(**LIB**)
    

    所以 -l 选项不会被传递给链接器

    g++ -o tiff2png1.so main.o -L /data/content/cuda/opencv-2.4.6/lib **should be here** main.o
    

    【讨论】:

    • Makefile 的“S”修复现在使其生成与命令行相同的错误。链接器似乎没有检测到 Makefile 中的“*.a”库。 “opencv_gpu”被添加到 Makefile 中,它似乎是唯一被检测到的库。它有一个“.so”扩展名。谢谢。
    • 是否需要一些其他标志来让链接器检测 *.a 文件?
    • 我之前使用 -l 标志加载了静态库 (.a),所以我知道这是可行的。我没有尝试混合动态库(.so),但这可能会导致您的问题。也许试试这个来强制静态链接:stackoverflow.com/questions/3698321/…
    • 另外,请确保在依赖于它的库之前加载任何依赖于其他库的库。
    • 以下错误信息令人困惑:/data/content/cuda/opencv-2.4.6/lib/libopencv_gpu.so: undefined reference to `cv::gpu::convertTo(cv::gpu ::GpuMat const&, cv::gpu::GpuMat&, double, double, CUstream_st*)'。这表明 opencv 库缺少方法。
    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2018-03-04
    相关资源
    最近更新 更多