我有一个可以编译的静态库,看起来(简化)如下:

math_util.h:

void foo(...);

math_util.cpp:
void foo(...) { ... }

A.cpp:
#include "math_util.h"
class A
{
    bar() {
        foo(...);
    }
}

静态库可以正常编译。
但是,当我想在实际应用中使用A时,我得到:
undefined reference to `foo(...)'

但是当我用nm检查我的静态库时:
math_util.o:
                 U _GLOBAL_OFFSET_TABLE_
000000000000010a T _ZN8fooEPA2_dPdj

这不是原型(prototype)问题,因为如果我将foo的代码复制到A.cpp中,则可以正常工作。

所以,我不明白,为什么G++找不到符号,即使它显然存在于静态库中也是如此?
对于其他功能,我没有这个问题。

注意:在这种情况下,我正在使用QtCreator运行Linux,并且两个项目都使用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/estimation/simple_estimation.cpp

项目文件:

https://github.com/jcelerier/spectral-subtraction/blob/master/libnoisered/libnoisered.pro

最佳答案

您在.h文件中的签名;

void compute_power(fftw_complex *in, double *powoutput, int size);

.cpp文件中的签名不兼容;
void compute_power(fftw_complex *in, double *powoutput, unsigned int size)

它们被重命名为用于链接的不同符号。

更改它们以使其相同,并且应该链接。

关于c++ - 链接器即使在静态库中也找不到函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18040876/

10-11 23:15
查看更多