Ошибка приложения во время выполнения приложения C, которое импортирует методы из библиотеки DLL, созданной с помощью c-shared в go - PullRequest
0 голосов
/ 17 мая 2019

Создано простое консольное приложение, которое импортирует функции, представленные в DLL, и DLL была создана с использованием опции c-shared в golang.Go DLL зависит от другой DLL, которая была создана с использованием C ++.Зависимые библиотеки DLL расположены по правильному пути, поэтому консольное приложение может найти их во время загрузки.«При запуске консольного приложения произошла ошибка« Приложение не удалось правильно запустить (0x0000142) ».

Я попытался запустить его на компьютере под управлением Windows10 и попытался создать исполняемую программу, используя cgo, чтобы добавить зависимость от других библиотек DLL.Исполняемый файл работает нормально, но когда он превращается в DLL, а затем возникает проблема при импорте DLL в приложение C.

Проверка DLL была создана с использованием следующего кода

check.h

#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) char* testing1(char* input);
__declspec(dllexport) char* testing2(char* input);

#ifdef __cplusplus
}
#endif

check.cpp
#include <cstdio>
#include <cstdlib>
#include <iostream>
#define DllExport __declspec(dllexport)

extern "C" __declspec(dllexport) char* testing1(char* input){
    return input;
}
extern "C" __declspec(dllexport) char* testing2(char* input){
    return input;
}

int main(int argc, char* argv[])
{
    char* result = testing1("testing ");
    std::cout<<"Result : "<< result<<std::endl;
}```

Go code for creating DLL which dependency on above created Check.DLL
package main

/*
#cgo LDFLAGS: -lCheck
#include <check.h>
#include <stdlib.h>
#include <string.h>
*/
import "C"
import "fmt"

//export AddTwoNums
func AddTwoNums(numone int, numtwo int) int {
    return numone + numtwo
}

//export Validate
func Validate(args *C.char) *C.char {
    str := C.GoString(args)
    str = str + "-" + str
    return C.CString(str)
}

func importFromClib1() {
    str1 := "Testing1"
    cstr := C.CString(str1)
    result := C.testing1(cstr)
    fmt.Println("Testing1 result : ", C.GoString(result))
}

func importFromClib2() {
    str1 := "Testing2"
    cstr := C.CString(str1)
    result := C.testing2(cstr)
    fmt.Println("Testing2 result : ", C.GoString(result))
}

func main() {
} 

Ожидается, что импорт функций AddTwoNums и Validate не должен вызывать проблем при запуске консольного приложения.Но ошибка, упомянутая в проблеме, видна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...