2016-08-25 28 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! 
>