2013-08-04 24 views
0

我已經編譯靜態庫,和外觀(簡體)是這樣的:連接器找不到的功能,即使他們是在一個靜態庫

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(...)' 

但是,當我檢查我的靜態庫與納米:

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

+3

顯示更多的源代碼,並給出實際的編譯過程(或'Makefile')。 –

+0

我使用qmake,它反過來生成makefiles。 你只需在project.pro文件中指定'SOURCES =(cpp文件)'和'HEADERS =(頭文件)',它會照顧它,有點像CMake –

回答

2

您在.h文件中的簽名;

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

.cpp文件中的簽名不兼容;

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

它們被命名爲不同的符號鏈接。

改變他們是一樣的,事情應該聯繫起來。

+1

啊,我已經加倍檢查了它可能是二十次...惡毒的小無簽名。謝謝! –

相關問題