【问题标题】:x86_64-w64-mingw32-g++ options -static-libgcc -static-libstdc++ seem to be broken in g++x86_64-w64-mingw32-g++ options -static-libgcc -static-libstdc++ 似乎在 g++ 中被破坏了
【发布时间】:2020-09-04 08:03:14
【问题描述】:

概述

说明 x86_64-w64-mingw32-g++ 在 OS-X 上构建共享库以在 Windows 上部署时无法包含 libstc++-6.dll、libwinpthread-1 的 SSCCE。 dlllibgcc_s_seh.dll 即使指定了选项 -static-libgcc -static-libstdc++

如果这是 mingw 中的错误,那么我将不胜感激知道如何报告它。

用于构建项目的命令在 bash shell 脚本文件中:doit.sh

# Clean up
rm -rf *.o *.dll Main.exe winlibs

# Cross compile for the Windows shared library
GPP=/usr/local/bin/x86_64-w64-mingw32-g++
$GPP -c MyLib.cpp -o MyLib.win.o
$GPP  -shared -static-libgcc -static-libstdc++ -o MyLib.dll *.win.o

# Build Application Main.exe
$GPP  -c Main.cpp -o Main.win.o
$GPP  -o Main.exe MyLib.dll Main.win.o

程序已编译,但在 Windows 10 上执行时报告 libstdc++-6.dll、libgcc_s_seh-1.dlllibwinpthread-1.dll 丢失。

-static-libgcc-static-libstdc++ 似乎对 getneralted 共享库没有影响。

将缺少的库从 mingw 分发版复制到与应用程序相同的文件夹中,这样 prgram 就可以正常运行。

我的库
extern int add (int a, int b);
MyLib.cpp
#include "MyLib.h"

extern int add (int a, int b) {
    return a + b;
}
主文件
#include <iostream>  
#include "MyLib.h" 

using namespace std; 
  
int main() 
{ 
    cout << "add(51700, 73)=" << add(51700, 73) << endl;       
    return 0; 
} 
工具版本
| Tool                       | Version               |
|----------------------------|-----------------------|
| MacBook Pro                | OS-X Catalina 10.15.6 |
| x86_64-w64-mingw32-gcc/g++ | 9.3.0 (GCC) (download with brew install mingw-w64) |
| uname -a                   | Darwin michaels-mbp 19.6.0 Darwin Kernel Version 19.6.0: Thu Jun 18 20:49:00 PDT 2020; root:xnu-6153.141.1~1/RELEASE_X86_64 x86_64 |
亚搏体育应用网址

该项目在 GitLab 上公开,网址为:https://gitlab.com/Michael51773/mingwwindowssharedlibbug

【问题讨论】:

  • 你试过简单地使用-static吗?这应该链接所有需要的库。
  • 选项-static-libgcc -static-libstdc++ 不应该链接libwinpthread-1 库。对我来说,如果另外两个也丢失了,编译的程序甚至不会报告 libwinpthread-1 库丢失。在将其他两个库与-static-libgcc -static-libstdc++ 链接后,您确定您不仅缺少libwinpthread-1 吗?
  • 在 Adrian Ho 的帮助下找到了适合我的解决方案(见下文)

标签: shared-libraries cross-compiling mingw32


【解决方案1】:

感谢 Adrian Ho 为我提供了解决方案,只需同时使用 -static 和 -shared 选项即可:

/usr/local/bin/x86_64-w64-mingw32-g++ -shared -static -o MyLib-static.dll MyLib/*.win.o

完整的描述可以在这里找到:https://discourse.brew.sh/t/x86-64-w64-mingw32-g-broken-options-static-libgcc-static-libstdc/8705/22

【讨论】:

  • 嗯,当然你还需要-shared,因为你正在构建一个共享库。我认为从您的问题描述中可以明显看出这一点。
  • 我一直使用 shard 选项,令人困惑的是我发出的 -static 选项是用于生成静态库,因此与 -shared 选项不兼容,而 -static 选项用于静态无论您是制作共享产品还是静态产品,都包括依赖库。
猜你喜欢
  • 2015-10-04
  • 2012-10-21
  • 2016-03-11
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
相关资源
最近更新 更多