Cygwin链接共享库

时间:2016-08-25 02:58:34

标签: c++ gcc linker cygwin shared-libraries

更新

删除了有关.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 ();

1 个答案:

答案 0 :(得分: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!
>