2

コンパイルする静的ライブラリがあり、次のように(簡略化されて)表示されます。

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

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 に答える