我有一个项目,其结构按以下方式定义(项目链接为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()
相同的功能。
答案 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的答案,但它并不是我想要的。