Cygwin 链接共享库
Cygwin linking shared library
更新:
删除了关于 .so 文件的旧问题。它们不适用于 Windows.
我使用头文件解决了以下问题。我猜每次 link 使用 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 ();
您遇到了编译器问题;不是链接器问题。编译器告诉你编译 myprog.cc 时找不到函数 hello()
.
您需要为 hello()
编写一个函数声明。注意:你的函数 definition for 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!
>
更新:
删除了关于 .so 文件的旧问题。它们不适用于 Windows.
我使用头文件解决了以下问题。我猜每次 link 使用 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 ();
您遇到了编译器问题;不是链接器问题。编译器告诉你编译 myprog.cc 时找不到函数 hello()
.
您需要为 hello()
编写一个函数声明。注意:你的函数 definition for 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!
>