使用Eigen库的C++有限元程序链接报错:未定义符号
解决Eigen模板函数的链接器未定义符号错误
嘿,这个链接错误是C++模板开发里非常典型的问题,根源在于链接器找不到pear::extract模板函数针对你用到的特定Eigen矩阵类型的实例化代码。下面给你几个针对性的解决方案:
检查模板函数的定义位置
模板函数的实现(定义)必须让调用它的代码在编译期能看到。如果pear::extract的定义是放在.cpp源文件里的,赶紧把它移到对应的头文件中(或者在头文件里通过#include引入包含定义的文件)。因为编译器需要在编译调用代码时,根据传入的模板参数生成具体的函数实例,只在头文件声明、cpp里定义的话,编译器没法生成对应实例,链接器自然找不到。显式实例化所需的模板版本
如果出于某些原因必须把模板定义留在.cpp文件里,那你需要在该cpp文件中显式实例化你用到的这个特定模板组合,代码如下:template Eigen::Matrix<float, 3, 1> pear::extract< Eigen::Matrix<float, 3, 1>, Eigen::Matrix<float, -1, 1>, Eigen::Block<Eigen::Matrix<int, -1, -1>, 1, -1, false> >(const Eigen::Matrix<float, -1, 1>&, Eigen::Block<Eigen::Matrix<int, -1, -1>, 1, -1, false>);这样编译器会提前生成这个实例的机器码,链接器就能找到它了。
确认所有源文件都参与编译链接
检查你的编译命令,确保包含pear::extract定义的那个源文件(比如pear.cpp)已经被编译成目标文件,并且在链接阶段被包含进去了。比如用g++的话,命令应该类似:g++ your_main.cpp pear.cpp -o your_program -I/path/to/eigen要是漏了
pear.cpp,链接器肯定找不到函数定义。验证模板参数的精确匹配
仔细核对调用extract时传入的类型和模板定义的参数是否完全一致,尤其是Eigen矩阵的模板参数(比如存储顺序0代表列优先、动态维度的-1这些)。哪怕是细微的参数差异,编译器都会认为是不同的模板实例,导致链接失败。
内容的提问来源于stack exchange,提问作者hdeplaen
相关产品推荐
相关产品推荐

