我有一个静态库,可以编译,看起来像这样简化:
math_util.h:
void foo(...);
math_util.cpp:
void foo(...) { ... }
A.cpp:
#include "math_util.h"
class A
{
bar() {
foo(...);
}
}
静态lib编译好了。
但是,当我想在真实应用中使用A
时,我得到:
undefined reference to `foo(...)'
但是当我用nm检查我的静态库:
math_util.o:
U _GLOBAL_OFFSET_TABLE_
000000000000010a T _ZN8fooEPA2_dPdj
这不是原型问题,因为如果我将foo
的代码复制到A.cpp中,它可以正常工作。
所以,我不明白,为什么G ++找不到符号,即使它显然存在于静态库中? 我没有任何其他功能的问题。
注意:如果我正在运行Linux,使用QtCreator并且我在两个项目中使用qmake(但是静态库是纯STL C ++,不涉及Qt)。
编辑:查看真实的涉及文件:
https://github.com/jcelerier/spectral-subtraction/blob/master/libnoisered/math_util.h
https://github.com/jcelerier/spectral-subtraction/blob/master/libnoisered/math_util.cpp
A.cpp:
项目文件:
https://github.com/jcelerier/spectral-subtraction/blob/master/libnoisered/libnoisered.pro
答案 0 :(得分:2)
您在.h
文件中的签名;
void compute_power(fftw_complex *in, double *powoutput, int size);
与.cpp
文件中的签名不兼容;
void compute_power(fftw_complex *in, double *powoutput, unsigned int size)
它们被命名为不同的符号以进行链接。
将它们改为相同,事情应该链接。