2014-10-10 147 views
0

我想編譯一個簡單的DLL,遵循cygwin tutorial。除了最後一步,我已經能夠成功地完成所有工作。當我執行命令:編譯和鏈接DLL時出錯

gcc -o myprog myprog.c -L./ -lmydll 

我得到一個錯誤,說hello()沒有在該範圍內聲明。我逐字地跟着教程,但我仍然無法編譯這個簡單的項目,並且爲什麼會丟失。

爲單個文件的代碼如下:

(myprog.c中)

int main(void){ 
    hello(); 
} 

(mydll.c)

#include <stdio.h> 
int hello(){ 
    printf("Hello World!\n"); 
    return 0; 
} 
+0

當然,你應該向我們展示myprog.c中的代碼嗎? – 2014-10-10 09:47:35

+0

@JohnZwinck更新,但我不認爲這和網頁有什麼區別。 – MichaelMitchell 2014-10-10 09:55:37

回答

0

好,用於鏈接庫中的語句可能不正確。 應該

-L<library path> -lyoulibrarymane

,因爲沒有 「./」 後,庫路徑存在。 這裏是我用過的一個例子,它可能會有所幫助。該-I/usr/local/include是頭文件路徑

的gcc -o你好世界helloopencv.c -I在/ usr /本地/ -L包括在/ usr/local/lib目錄-lopencv_highgui -lopencv_core -lopencv_imgproc

+0

如果'.dll'和其他文件位於同一目錄下,'-L'會是什麼。 '.c'和'.dll'只有一個文件夾。 – MichaelMitchell 2014-10-10 09:59:15

+0

只需在您的推薦中刪除「./」,如果它不起作用,則嘗試整個庫路徑。您可以通過推薦'pwd' – 2014-10-10 10:19:22

0

您需要在myprog.c中的頂部添加聲明:

int hello(void); 

或者你可以把這個新的mydll.h和#包括在myprog.c中。

+0

來查看您當前的工作路徑。爲什麼這不會包含在示例頁面中?這是否意味着你會這樣做? – MichaelMitchell 2014-10-10 10:00:01

+0

如果編譯時禁用了警告,程序將「工作」。但是沒有人應該在2014年或者甚至是2004年編寫這樣的代碼。教程代碼根本不適合現代人編寫......就像過去的2.5年一樣。 – 2014-10-10 10:01:39

1

的例子是爲我工作的罰款,我的Cygwin

[email protected] /cygdrive/d/userdata/armathew/Desktop/WWWW 
$ ls 
mydll.c myprog.c 

[email protected] /cygdrive/d/userdata/armathew/Desktop/WWWW 
$ gcc -c mydll.c 

[email protected] /cygdrive/d/userdata/armathew/Desktop/WWWW 
$ gcc -shared -o mydll.dll mydll.o 

[email protected] /cygdrive/d/userdata/armathew/Desktop/WWWW 
$ gcc -o myprog myprog.c -L./ -lmydll 

[email protected] /cygdrive/d/userdata/armathew/Desktop/WWWW 
$ ./myprog.exe 
Hello World! 

什麼是您使用的是Cygwin的版本?我的是1.7.5

[email protected] /cygdrive/d/userdata/armathew/Desktop/WWWW 
$ uname -r 
1.7.5(0.225/5/3)