体系结构x86_64的未定义符号,共享Util库,使用cmake构建,
Undefined symbols for architecture x86_64, shared Util Library, build with cmake,
我有一个简单但令人困惑的问题。我搜索了栈溢出和网络,但没有找到任何有用的东西。我知道这个问题很常见,关于堆栈溢出也有类似的问题,但它们并没有帮助我解决这个问题;
我正在构建一个在C++中使用ITK和VTK的应用程序。它是使用cmake和unix make构建的,我使用的是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
一般来说,这是一个包含不正确或链接不正确的错误。然而,我在这些文件中使用了许多其他功能,它们运行良好。。。我最近还更改了文件的结构,使其使用带有source(.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})
test/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++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 无法在Ubuntu上将共享库与Eclipse链接
- 从python调用openMP共享库时,未定义opnMP函数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 为什么我的共享库中存在展开符号
- 使用共享指针的函数调用,其对象应为 const
- 具有两个独占锁组的共享锁
- 共享队列的线程安全
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 多个"常量引用"变量可以共享同一个内存吗?
- 如何访问由共享指针保存的类方法?
- 体系结构x86_64的未定义符号,共享Util库,使用cmake构建,