Создано простое консольное приложение, которое импортирует функции, представленные в 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 не должен вызывать проблем при запуске консольного приложения.Но ошибка, упомянутая в проблеме, видна.