项目中的链接错误
Linkage error in Project
我有一个项目,其结构按以下方式定义(link 项目是 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()
但编译器给出了 linkage 错误,说"undefined reference to GetImageInfo()" 在 GCC 和 MSVC 2012 中。我很困惑,因为当我试图从 main.cpp 使用 [=45= 去定义这个函数时](通过按 F12),它能够完美地定义定义(这表明包含没有任何问题)。同样,当我从 utilities.h 调用 basic::fileExists()
时,它工作正常。
我也尝试过使用 CMakeLists 将文件夹 /classes/itk/ 直接作为包含,但即使这样也行不通。但是,当我将 basicITK class 移动到 /classes/ 下时,它工作得很好。但是,我宁愿保留一个隔离的文件夹结构以简化未来的扩展。
如有任何帮助,我们将不胜感激!提前致谢。
更新:
为方便起见,我已从项目中删除了 ITK 依赖项。现在,basic::GetImageInfo()
具有与 basic::fileExists()
相同的功能。
ld 给出 'undefined reference' 当有函数声明但没有实现时。函数 'GetImageInfo' 在 'basicITK.h' 中声明,但实现位于静态库(或 DLL - 如果您使用 Windows)中,您在 [=18] 期间没有告诉 ld 包含它=]ing。你必须 运行 ld 有一个选项告诉它 link 外部库到你的程序(例如,在一些 Linux 操作系统上这个选项是 '-ldefined library name',所以如果我的程序使用 zlib,那么我必须 运行 ld with '-lz' 选项)。
我通过从主 CMakeLists 将 CMake link 改为 /classes/itk/ 来解决这个问题。如果有人有兴趣,我会保留 github project page public.
感谢@SNC 的回答,但这并不是我想要的。
我有一个项目,其结构按以下方式定义(link 项目是 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()
但编译器给出了 linkage 错误,说"undefined reference to GetImageInfo()" 在 GCC 和 MSVC 2012 中。我很困惑,因为当我试图从 main.cpp 使用 [=45= 去定义这个函数时](通过按 F12),它能够完美地定义定义(这表明包含没有任何问题)。同样,当我从 utilities.h 调用 basic::fileExists()
时,它工作正常。
我也尝试过使用 CMakeLists 将文件夹 /classes/itk/ 直接作为包含,但即使这样也行不通。但是,当我将 basicITK class 移动到 /classes/ 下时,它工作得很好。但是,我宁愿保留一个隔离的文件夹结构以简化未来的扩展。
如有任何帮助,我们将不胜感激!提前致谢。
更新:
为方便起见,我已从项目中删除了 ITK 依赖项。现在,basic::GetImageInfo()
具有与 basic::fileExists()
相同的功能。
ld 给出 'undefined reference' 当有函数声明但没有实现时。函数 'GetImageInfo' 在 'basicITK.h' 中声明,但实现位于静态库(或 DLL - 如果您使用 Windows)中,您在 [=18] 期间没有告诉 ld 包含它=]ing。你必须 运行 ld 有一个选项告诉它 link 外部库到你的程序(例如,在一些 Linux 操作系统上这个选项是 '-ldefined library name',所以如果我的程序使用 zlib,那么我必须 运行 ld with '-lz' 选项)。
我通过从主 CMakeLists 将 CMake link 改为 /classes/itk/ 来解决这个问题。如果有人有兴趣,我会保留 github project page public.
感谢@SNC 的回答,但这并不是我想要的。