好的,我在当前项目中遇到链接器问题(这是另一个问题的延续,是的)
基本上,链接器在dynamiclib.so中提供了一个未定义的引用:
std::basic_ostream<char, std::char_traits<char> >& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::basic_ostream<char, std::char_traits<char> >&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)
我只能找到:
std::ostream& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::ostream&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)
在文件中。
事情是,它们是相同的方法,真的(basic_ostream和ostream是可互换的吗?)
如果我手动将第一个方法添加到命名空间,它会嘲笑它已经在编译时定义。
有谁知道这里到底会发生什么?
干杯,艾德
注意这是MPICXX和CCMAKE
答案 0 :(得分:0)
听起来你没有正确地将dynamiclib.so链接到SparseImplementationLib。你的makefile中是否有类似于-lSparseImplementationLib的链接器标志?
答案 1 :(得分:0)
我(我)正在使用像gStreamer这样的引擎一样的问题 - 在主代码中不存在从.so文件调用的函数。
我发现链接器正在删除该函数,因为它没有被任何内部函数调用。
目前,我通过强制函数调用/构造函数在一个有条件从不调用的函数中强制链接函数来解决这个问题: -
bool callme = false;
if(callme == true)
{
dummyfunction();
}
我发现这会强制链接器包含,但代码本身从未运行过。
如果有人有一个解决方案可以阻止链接器如此智能,或者使用“正确”的方法,我想听听它!
答案 2 :(得分:0)
好的,我昨晚在大约10个小时的黑客攻击后设法解决了这个问题。
事实证明,如果你对函数进行内联定义,它会编译,并确保它具有函数的选项,包含所有模板参数和非默认参数!