mingw、交叉编译、gcc

发布于 2024-11-05 11:07:20 字数 947 浏览 0 评论 0原文

一些上下文:

  • 我的程序使用libary libfl.a(flex库)。 我在linux下编译的:

    <块引用>

    gcc lex.yy.c -lfl

  • 我安装了 mingw 编译器 i58​​6-mingw32msvc-gcc (简单的“hello world”内容编译没有问题)

  • 我使用 ubuntu(可能不问题)

  • 我想在 linux 下为 windows 编译(生成可在 windows 上使用的二进制 .exe 文件)

我的问题和疑问:

当我尝试编译我的程序时

i586-mingw32msvc-gcc lex.yy.c -lfl

我收到错误:

[...] undefined reference to '_yywrap' 
[...] undefined reference to '_WinMain@16'
  1. 我是否正确理解我必须使用 i586-mingw32msvc-gcc 来编译 libfl.a 的内容才能使用在这个交叉编译中吗?
  2. 源代码中有函数yywrap(),但没有_yywrap()。为什么带有下划线 _ 的函数会出现错误?
  3. _WinMain@16 怎么了? (源代码中没有使用)

我的目标是了解这里发生了什么。 如果我让它工作,那么它的奖励积分:)

任何帮助表示赞赏

Some context:

  • My program uses libary libfl.a (flex library).
    I compile it under linux:

    gcc lex.yy.c -lfl

  • I have mingw compiler installed i586-mingw32msvc-gcc (simple 'hello world' stuff compiles without problem)

  • I use ubuntu (probably does not matter)

  • I want to compile under linux for windows (produce binary .exe file which would be usable on windows)

My problem and questions:

When I try compiling my program

i586-mingw32msvc-gcc lex.yy.c -lfl

I get errors:

[...] undefined reference to '_yywrap' 
[...] undefined reference to '_WinMain@16'
  1. Do I understand correctly that I have to compile the content of libfl.a also with i586-mingw32msvc-gcc to be able to use it in this cross-compilation?
  2. In the source code there is function yywrap(), but not _yywrap(). Why I get error for function with underscore _?
  3. Whats up with the _WinMain@16? (no usage in source code)

My goal would be to understand what is happening here.
If I get it to work, then its bonus points :)

Any help is appreciated

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鸵鸟症 2024-11-12 11:07:20
  1. 是的,当然。原因如下:
  2. C++ 在函数名称中编码有关函数的附加语义信息,例如命名空间/类亲和性、参数类型等(称为名称修改)。因此,C++ 库名称与您在源代码中看到的名称有些不同。每个编译器都以自己的方式执行此操作,这就是为什么通常无法链接使用不同编译器构建的库的 C++ 函数(C 函数名称仍然不会被破坏)。
  3. 从重整风格来看,未定义的符号是由 Microsoft C++ 编译器引入的。我不知道为什么它需要 WinMain,但是在用它重新编译库之后,所有这些错误可能都会消失。是的:也许 WinMain() 这个东西是从 msvc 使用它而不是 main() 产生的,对于一个格式良好的程序来说,它的存在是必须的? ;)
  1. Yes, certainly. And here's why:
  2. C++ encodes additional semantic information about functions such as namespace/class affinity, parameter types etc. in the function name (that is called name mangling). Thus C++ library names are somewhat different from what you see in the source code. And each compiler does it in it's own way, that's why generally you're unable to link against C++ functions (C function names don't get mangled still) of a library built with a different compiler.
  3. Judging to mangling style, the undefined symbols are brought in by the Microsoft C++ compiler. I don't know exactly about why it needs WinMain, but after you recompile the libs with it, all these errors likely will be gone. And yes: maybe the WinMain() thing rises from msvc using it instead of main(), which presence is obligatory for a well-formed program? ;)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文