2016-08-25 65 views
2

UPDATE:Cygwin的將共享庫

刪除了約.so文件的老問題。他們不打算在Windows上工作。

我用頭文件解決了下面的問題。我猜這是每次使用C++進行鏈接時使用.h文件的標準慣例?

mydll.h:

#ifndef mydll_h_ 
#define mydll_h_ 
void hello(); 
#endif 

myprog.cc:

#include "mydll.h" 
int main() 
{ 
    hello(); 
    return 0; 
} 

mydll.cc:

#include <iostream> 

void hello() 
{ 
    std::cout << "Hello World!\n"; 
} 

可替換地,我試圖使用Cygwin用的.dll庫本指南:https://cygwin.com/cygwin-ug-net/dll.html

他們的.c文件的編譯工作,但我想讓它爲我的.cc文件工作。有任何想法嗎?

mydll.cc:

#include <iostream> 

void hello() 
{ 
    std::cout << "Hello World!\n"; 
} 

myprog.cc:

int main() 
{ 
    hello(); 
    return 0; 
} 

我輸入:

g++ -c mydll.cc 
g++ -shared -o mydll.dll mydll.o 

但是,當我鍵入:

g++ -o myprog myprog.cc -L./ -lmydll 

我收到:

myprog.cc: In function ‘int main()’: 
myprog.cc:4:10: error: ‘hello’ was not declared in this scope 
    hello(); 
+0

「'hello'未在此範圍內聲明」這與庫無關。 .cc是一個C++源代碼文件後綴。你需要用C++聲明函數。 –

+0

在Windows上,沒有「共享庫」。有DLL。它們的默認文件名後綴是.dll。 Cygwin沒有改變這一點。 –

+0

我試着改變功能,但它給出了相同的錯誤。在你的第二個評論中,我想這會把問題縮小到第二個。 – Dobob

回答

1

您正面臨編譯器問題;不是鏈接器問題。編譯器告訴你,當它編譯myprog.cc時,它找不到函數hello()

您需要爲hello()編寫函數聲明。注意:你的功能定義hello()在mydll.cc中。

一個函數的聲明,簡直是:

void hello(); 

(1)你可以把這個代碼一行在myprog.cc以上int main()

(2)還可以放置的代碼本的一行在由myprog.cc,並且任選被mydll.cc包括至少的頭文件。但良好的編程習慣決定了頭文件應該包含在兩者中。

如果按照選項1 myprog.cc以下版本將解決您的編譯器錯誤:

void hello(); // "extern void hello();" would be more proper. 

int main() 
{ 
    hello(); 
    return 0; 
} 

選項2將需要:

myprog.cc

#include <mydll.h> 

int main() 
{ 
    hello(); 
    return 0; 
} 

不管怎樣結果成功編譯和執行:

>g++ -c mydll.cc 
>g++ -shared -o mydll.dll mydll.o 
>g++ -o myprog myprog.cc -L./ -lmydll 
>./myprog.exe 
Hello World! 
>