2

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

math_util.h:

void foo(...);

数学实用程序.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

这不是原型问题,因为如果我将代码复制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

4

1 回答 1

4

.h您在文件中的签名;

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

与文件中的签名不兼容.cpp

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

它们被命名为不同的符号以进行链接。

将它们更改为相同,并且事情应该链接。

于 2013-08-04T08:11:02.777 回答