Seg故障从C调用Cygwin# 我有一些C++代码,最初是为Linux编写的,我可以在Ciggin下使用GCC在64位窗口中建立和运行而不存在问题。不过,现在我想把它转换成一个DLL,我可以从C#程序调用它 我发现,只要不使用CygWi1.DLL中定义的任何标准C/C++库函数,C++就可以调用CygWin下编译的C++函数,而不会出现问题。但是,例如,当我执行printf时,整个过程就会出现一个“分段错误”

Seg故障从C调用Cygwin# 我有一些C++代码,最初是为Linux编写的,我可以在Ciggin下使用GCC在64位窗口中建立和运行而不存在问题。不过,现在我想把它转换成一个DLL,我可以从C#程序调用它 我发现,只要不使用CygWi1.DLL中定义的任何标准C/C++库函数,C++就可以调用CygWin下编译的C++函数,而不会出现问题。但是,例如,当我执行printf时,整个过程就会出现一个“分段错误”,c#,c++,cygwin,C#,C++,Cygwin,在网上搜索答案时,我看到它声称您需要首先调用cygwin_dll_init()。然而,当我添加它时,它只是终止,根本没有错误消息 我做错了什么?我非常确定.NET运行时成功地找到了我的DLL和cygwin1.DLL,因为如果两者都不存在,我会得到一个DllNotFoundException 这里有一个产生相同症状的最小测试用例。首先,DLL的cygwin/C++代码: #include <cstdio> extern "C" __declspec(dllexpo

在网上搜索答案时,我看到它声称您需要首先调用cygwin_dll_init()。然而,当我添加它时,它只是终止,根本没有错误消息

我做错了什么?我非常确定.NET运行时成功地找到了我的DLL和cygwin1.DLL,因为如果两者都不存在,我会得到一个DllNotFoundException

这里有一个产生相同症状的最小测试用例。首先,DLL的cygwin/C++代码:

#include <cstdio>

extern "C" __declspec(dllexport) int test();

int test() {
    printf("Test successful");
    return 14;
}

我强烈建议您使用mingw64交叉编译器编译DLL。这允许您构建不使用cygwin1.dll的dll。相反,它将只调用Windows运行时DLL。只要您不需要调用任何其他cygwin DLL,这应该可以正常工作

  • 您需要使用cygwin安装应用程序安装mingw64编译器包。安装
    mingw64-x86\u 64-gcc-g++
    软件包

  • 创建GNUmakefile,如下所示:

  • 在cygwin bash提示符下,运行
    makecleanlall

  • 创建Makefile,如下所示:

  • 在cmd.exe提示符下以
    nmake-nologo clean all
    的形式运行此命令

  • main.exe
    的形式运行exe。通常,libtest.dll必须与main.exe位于同一目录或路径中


  • 这里的生成文件是从使用或不使用cygwin1.dll生成的版本中删除的,我希望不会,但可能包含错误。

    我强烈建议您使用mingw64交叉编译器编译dll。这允许您构建不使用cygwin1.dll的dll。相反,它将只调用Windows运行时DLL。只要您不需要调用任何其他cygwin DLL,这应该可以正常工作

  • 您需要使用cygwin安装应用程序安装mingw64编译器包。安装
    mingw64-x86\u 64-gcc-g++
    软件包

  • 创建GNUmakefile,如下所示:

  • 在cygwin bash提示符下,运行
    makecleanlall

  • 创建Makefile,如下所示:

  • 在cmd.exe提示符下以
    nmake-nologo clean all
    的形式运行此命令

  • main.exe
    的形式运行exe。通常,libtest.dll必须与main.exe位于同一目录或路径中


  • 这里的makefile是从使用和不使用cygwin1.dll构建的版本中删除的,我希望不会,但可能包含错误。

    您用来编译和链接程序的命令(或来自makefile的命令)是什么。如上所述,dll是用“g++-o test.dll-shared test.cpp”编译的。C#代码是用“csc.exe-t:exe-out:test.exe test2.cs-nologo”编译的。您用来编译和链接程序的命令(或makefile中的命令)是什么。如上所述,DLL是用“g++-o test.DLL-shared test.cpp”编译的。C代码是用“csc.exe-t:exe-out:test.exe test2.cs-nologo”编译的。我应该提到你应该编辑main.cs删除第5-6行和第14-15行。我应该提到你应该编辑main.cs删除第5-6行和第14-15行。
    using System;
    using System.Runtime.InteropServices;
    
    class MainClass {
        [DllImport("cygwin1.dll")]
        private static extern void cygwin_dll_init();
        
        [DllImport("test.dll")]
        private static extern int test();
        
        public static void Main(string[] args) {
            Console.WriteLine("running...");
    
            // Remove this line if you want a seg fault
            cygwin_dll_init();
    
            test();
    
            // Seg fault or no, this never gets run
            Console.WriteLine("done");
        }
    }
    
     # GNUmakefile - for cygwin make will use this instead of Makefile
    
    CXX=x86_64-w64-mingw32-g++
    CXXFLAGS=-Wall -Wextra -Werror
    
    all:    libtest.dll
    
    clean:
        rm -f *.dll
    
    libtest.dll:  test.cpp
        $(CXX) $(CXXFLAGS) -shared -o libtest.dll test.cpp
    
    # Makefile - for VS nmake
    
    CS=csc
    CSFLAGS=-nologo -w:3 -warnaserror+ -optimize- -debug+
    
    all :   main.exe
    
    clean :
        del /q *.exe 2> nul:
        del /q *.pdb 2> nul:
    
    main.exe : main.cs
        $(CS) $(CSFLAGS) -t:exe -out:main.exe main.cs