Project中的链接错误

时间:2015-02-26 19:12:18

标签: c++ visual-studio-2012 gcc compiler-errors cmake

我有一个项目,其结构按以下方式定义(项目链接为here):

project_source/
    CMakeLists.txt
    .gitignore
    src/
        main.cpp -> main program file
        windows/  -> contains Unix header implementations for Windows
            CMakeLists.txt
            dirent.h
            getopt.cpp
            getopt.h
        classes/ -> custom class directory
            CMakeLists.txt
            utlities.cpp
            utilities.h
            itk/ -> classes using ITK
                CMakeLists.txt
                basicITK.cpp
                basicITK.h

我正在尝试使用在 basicITK.h 中声明的函数basic::GetImageInfo(),但是编译器给出了一个链接错误,说"未定义的引用GetImageInfo()& #34;在GCC和MSVC 2012中。我很困惑因为当我尝试使用Visual Studio从 main.cpp 定义此函数时(通过按F12),它能够进行定义完全没问题(这表明包含有任何问题)。同样,当我从 utilities.h 调用basic::fileExists()时,它运行正常。

我还尝试将文件夹 / classes / itk / 直接作为使用CMakeLists的包含,但即使这样也无效。但是,当我在 / classes / 下移动 basicITK 类时,它完全正常。但是,我宁愿保留一个隔离的文件夹结构来简化将来的扩展。

对此的任何帮助将非常感谢!提前谢谢。

更新:

为方便起见,我已从项目中删除了ITK依赖项。现在,basic::GetImageInfo()具有与basic::fileExists()相同的功能。

2 个答案:

答案 0 :(得分:1)

ld给出了未定义的引用&#39;当有一个没有实现的函数声明时。功能&#39; GetImageInfo&#39;在&quot; basicITK.h&#39;中声明,但实现位于静态库(或DLL - 如果您使用Windows),您没有告诉ld在链接期间包含。您必须使用一个选项运行ld,该选项告诉它将外部库链接到您的程序(例如,在某些Linux操作系统上,此选项是&#39; -l <​​em>定义的库名称&#39;,所以如果我的程序使用zlib,那么我必须使用&#39; -lz&#39;选项运行ld。

答案 1 :(得分:0)

我通过从CMakeLists主CMake链接到 / classes / itk / 来解决了这个问题。如果有人有兴趣,我会保留github project page公开。

感谢@SNC的答案,但它并不是我想要的。