我有一个简单但令人困惑的问题。我搜索了堆栈溢出和网络,我没有发现任何有用的东西。我知道这个问题很常见,并且有关堆栈溢出的类似问题,但是它们没有帮助我解决这个问题;
我正在构建一个在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)结构的头(.h)。以前,我将声明和实现放在一个.h文件中。该文件太长而且杂乱无章,所以我重构了头/源结构。
相关行:
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错误的行,但我认为问题可能与此有关。所以我把它留下来让我的帖子更简洁。
答案 0 :(得分:1)
您的问题是:模板函数(此处为print_vector
)必须显式实例化,或其定义(正文)必须才能在< em>使用它的每个翻译单元。
通常这意味着您永远不能将模板函数定义放入.cxx
文件中(就像您在此处所做的那样)并期望它能够正常工作。
它可能适用于一个版本的编译器,只是为了打破下一个版本,或者它可能根本不起作用。
TL; DR将print_vector
的正文从MyUtils.cxx
移至MyUtils.h
。