2012-10-25 56 views
1

當我嘗試編譯我的應用程序,我得到兩個錯誤:如何提供鏈接中找不到的函數?

$ G ++ -static -emit的SWF -o CloudClient.swf -I ../升壓/ boost_libraries /安裝目錄/包括-I ../ffm peg-1.0/bin/include -L ../ boost/boost_libraries/install-dir/lib -L ​​../ ffmpeg-1.0/bin/lib timer.o audio_encoder.o audio_generator.o video_encoder.o video_generator_rainbow.o SIM ple_synchronizer.o multiplexer.o transmitter.o graph_runner.o cloud_client.o -lswscale -lavformat -lavcodec -lavutil -lboost_system -lboost_date_time -lboost_thread -pthread -lm

../ffmpeg-1.0/bin/lib/libswscale.a: error: undefined reference to 'exp' 
../ffmpeg-1.0/bin/lib/libavcodec.a: error: undefined reference to 'log' 
collect2: ld returned 1 exit status 

如果logexp是我的問題,如果在任何地方我把-lm它並不能幫助我不知道如何從字面上創建自己的存根,而不是explog,並與他們聯繫我的庫? ...

+0

只需使用匹配簽名創建空函數? –

+0

'-pthread'看起來不對。 –

+0

@JosephQuinsey:沒關係。從'man gcc':'-pthread:使用pthreads庫增加對多線程的支持。此選項爲預處理器和鏈接器設置標誌。' – nneonneo

回答

2

你可以在C文件(比由C編譯器編譯,而不是C++編譯器編譯)或C++文件中實現它們,然後給出extern「C」鏈接。例如:

extern "C" double log(double x) 
{ 
    // ... 
} 

顯然它會更好地解決鏈接問題。您不應該提供您自己的標準C庫例程版本。

+0

是否有可能獲得庫中使用了哪個函數重載? – myWallJSON

+1

@myWallJSON C++庫提供了三種重載(http://www.cplusplus.com/reference/clibrary/cmath/log)。但是,C沒有超載。它只有'雙'版本。我假設ffmpeg是用C編寫的,因此你不必提供任何重載(即使你做了,C代碼也不能使用它們;重載只能用於C++連接)。 'extern「C」'功能。) –

相關問題