gpt4 book ai didi

c++ - 体系结构 x86_64 的 undefined symbol ,共享 Util 库,使用 cmake 构建,

转载 作者:行者123 更新时间:2023-11-28 07:15:56 26 4
gpt4 key购买 nike

我有一个简单但令人困惑的问题。我在堆栈溢出和网络上进行了搜索,但没有找到任何有用的信息。我知道这个问题很常见,在 stack overflow 上也有人问过类似的问题,但他们没有帮助我解决这个问题;

我正在构建一个在 C++ 中使用 ITK 和 VTK 的应用程序。它是使用带有 unix make 的 cmake 构建的,我使用的是 OS X 10.8.4 并使用 g++-4.2 进行编译。我有一个看起来像这样的结构:

    src
├── VascSeg //contains ITK filters that I have written
├── lib //contains header/source for some utility functions that I commonly use
└── test //contains tests for VascSeg Library

这是我遇到的错误:

Undefined symbols for architecture x86_64:
"void MyUt::print_vector<float>(std::vector<float, std::allocator<float> >&, char const*)", referenced from:
_main in VascularLevelSetTest.cxx.o

"void MyUt::DeepCopy<itk::Image<float, 2u> >(itk::Image<float, 2u> const*, itk::Image<float, 2u>::Pointer)", referenced from: itk::CommandLevelSetObserver<...>in VascularLevelSetTest.cxx.o
itk::CommandLevelSetObserver<...>:
:SaveWriteImage(...)in VascularLevelSetTest.cxx.o
ld: symbol(s) not found for architecture x86_64

一般来说,这是包含不当或链接不当造成的错误。但是,我在这些文件中使用了许多其他函数,它们工作正常......我最近还更改了文件的结构,以使用带有源 (.cxx) 结构的 header (.h)。以前,我将声明和实现放在一个 .h 文件中。该文件太长且杂乱无章,因此我重构为 header /源结构。

相关行:

using namespace MyUt;
...
std::vector<std::vector<float> > paramList_p1
std::vector<float> params1 = paramList_p1[config];
...

print_vector <float> (params1,"\t");

MyUtils.h:

namespace MyUt{
...
template<class T>
void print_vector(std::vector<T> &vec,const char* end = "\t");
...
}

MyUtils.cxx:

namespace MyUt{
...
template<class T>
void print_vector(std::vector<T> &vec,const char* end = "\t")
{...}
...
}

lib/CMakeLists.txt:

add_library(MyUtils SHARED MyUtils.cxx 
vtkUtils.cxx)
SET_TARGET_PROPERTIES(MyUtils PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(MyUtils ${ITK_LIBRARIES} ${VTK_LIBRARIES})

测试/CMakeLists.txt:

add_executable(VST VascularLevelSetTest.cxx)
TARGET_LINK_LIBRARIES(VST MyUtils)
TARGET_LINK_LIBRARIES(VST ${ITK_LIBRARIES})

如果这是一个重复的问题,我很抱歉,但我找到的所有问题都没有帮助我。

编辑:

我省略了 DeepCopy 错误的行,但我认为这些问题可能是相关的。所以我将其省略,以使我的帖子更加简洁。

最佳答案

您的问题是这样的:模板函数(此处为 print_vector)必须 显式实例化,或其定义(正文)必须在使用它的每个翻译单元中可用。

通常这意味着您永远不能将模板函数定义放入 .cxx 文件中(就像您在此处所做的那样)并期望它起作用。

它可能在一个版本的编译器上工作,只是在下一个版本中中断,或者它可能根本不工作。

TL;DR 将 print_vector 的主体从 MyUtils.cxx 移动到 MyUtils.h

关于c++ - 体系结构 x86_64 的 undefined symbol ,共享 Util 库,使用 cmake 构建,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com