链接器错误。这不可能

时间:2016-03-04 20:19:14

标签: c++ opencv linker

我正在尝试将sfm模块用于opencv。问题是将其联系起来。 那么,让我们看看代码。

main.cpp中:

function ColorChange() {
        var color = green;
        if color == "green" {
        var color = blue;
        }
        else if color == blue {
        var color = red;
        }
        else {
        var color = green;
        }
}

我将此代码编译为main.o.现在,我想将它与libopencv_core.so和libopencv_sfm.so链接起来。 第二个文件包含函数'reconstruct'的定义。我为什么确定?当我输入:

...
    cv::sfm::reconstruct(images_paths, Rs_est, ts_est, K2, points3d_estimated, true)
...

我得到了:

nm -D libopencv_sfm.so | grep reconstruct

我在main.o文件中检查了重构函数的签名。它符合:

00000000000b4ca0 T _ZN2cv3sfm11reconstructERKNS_11_InputArrayERKNS_12_OutputArrayES6_RKNS_17_InputOutputArrayEb
00000000000b4ba0 T _ZN2cv3sfm11reconstructERKNS_11_InputArrayERKNS_12_OutputArrayES6_RKNS_17_InputOutputArrayES6_b
00000000000b2650 T _ZN2cv3sfm11reconstructESt6vectorISsSaISsEERKNS_12_OutputArrayES6_RKNS_17_InputOutputArrayEb
00000000000b2550 T _ZN2cv3sfm11reconstructESt6vectorISsSaISsEERKNS_12_OutputArrayES6_RKNS_17_InputOutputArrayES6_b

因此共享库包含reconstruct的定义。

现在,我链接:

_ZN2cv3sfm11reconstructESt6vectorISsSaISsEERKNS_12_OutputArrayES6_RKNS_17_InputOutputArrayES6_b

它给了我错误:

g++ libopencv_core.so libopencv_sfm.so main.o -o main

我不明白。毕竟libopencv_sfm.so包含该函数的定义!

请:不要告诉我:使用cmake。我尝试使用cmake,问题是一样的。所以我试着在低级别上理解它。

提前致谢。

(gcc版本:5.1.1)

1 个答案:

答案 0 :(得分:3)

要链接库,请使用-l标志,并在依赖于它们的对象之后添加依赖项:

g++ -o main main.o -L. -lopencv_sfm -lopencv_core

-L.将在当前路径中搜索派系。如果不需要,请省略。