【问题标题】:Cygwin linking shared libraryCygwin 链接共享库
【发布时间】:2016-08-25 02:58:34
【问题描述】:

更新:

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

【问题讨论】:

  • "'hello' 未在此范围内声明"这与库无关。 .cc 是 C++ 源代码文件后缀。您需要在 C++ 中声明函数。
  • 在 Windows 上,没有“共享库”。有DLL。它们的默认文件名后缀是 .dll。 Cygwin 并没有改变这一点。
  • 我尝试更改功能,但它给出了相同的错误。关于您的第二条评论,我想这会将问题缩小到第二条。
  • “我尝试更改功能”不知道这意味着什么。如果您想询问有关编译问题的问题,请提出问题并提供源代码。如果您尝试了多个变体,请发布所有变体。
  • cygwin 的 gcc 编译教程仅适用于 .c 文件。如何将其配置为适用于 .cc 文件?

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


【解决方案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!
>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2016-01-02
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多