add export demo and test
This commit is contained in:
84
_demo/go/export/use/Makefile
Normal file
84
_demo/go/export/use/Makefile
Normal file
@@ -0,0 +1,84 @@
|
||||
# Makefile for C demo using Go exported library
|
||||
# Use LINK_TYPE environment variable to choose library type:
|
||||
# LINK_TYPE=static - Link with static library (default)
|
||||
# LINK_TYPE=shared - Link with shared library
|
||||
|
||||
CC = clang
|
||||
CFLAGS = -Wall -Wextra -std=c99
|
||||
INCLUDES = -I..
|
||||
TARGET = main.out
|
||||
SOURCES = main.c
|
||||
HEADER = ../libexport.h
|
||||
|
||||
# Default to static linking
|
||||
LINK_TYPE ?= static
|
||||
|
||||
# Platform detection
|
||||
UNAME_S := $(shell uname -s)
|
||||
ifeq ($(UNAME_S),Darwin)
|
||||
SHARED_EXT = dylib
|
||||
PLATFORM_LIBS =
|
||||
else
|
||||
SHARED_EXT = so
|
||||
PLATFORM_LIBS = $(shell pkg-config --libs libunwind 2>/dev/null || echo -lunwind)
|
||||
endif
|
||||
|
||||
# Library and flags based on link type
|
||||
ifeq ($(LINK_TYPE),shared)
|
||||
BUILDMODE = c-shared
|
||||
LIBRARY = ../libexport.$(SHARED_EXT)
|
||||
LDFLAGS = -L.. -lexport -lpthread -lm $(shell pkg-config --libs bdw-gc || echo -lgc) $(PLATFORM_LIBS)
|
||||
BUILD_MSG = "Building Go shared library..."
|
||||
LINK_MSG = "Linking with shared library..."
|
||||
else
|
||||
BUILDMODE = c-archive
|
||||
LIBRARY = ../libexport.a
|
||||
LDFLAGS = $(LIBRARY) -lpthread -lm $(shell pkg-config --libs bdw-gc || echo -lgc) $(PLATFORM_LIBS)
|
||||
BUILD_MSG = "Building Go static library..."
|
||||
LINK_MSG = "Linking with static library..."
|
||||
endif
|
||||
|
||||
.PHONY: all clean run build-go
|
||||
|
||||
all: build-go $(TARGET)
|
||||
|
||||
# Build the Go library first
|
||||
build-go:
|
||||
@echo $(BUILD_MSG)
|
||||
cd .. && ../../../llgo.sh build -buildmode $(BUILDMODE) -o export .
|
||||
|
||||
# Build the C executable
|
||||
$(TARGET): $(SOURCES) $(LIBRARY) $(HEADER)
|
||||
@echo $(LINK_MSG)
|
||||
$(CC) $(CFLAGS) $(INCLUDES) -o $(TARGET) $(SOURCES) $(LDFLAGS)
|
||||
|
||||
# Run the executable
|
||||
run: $(TARGET)
|
||||
@echo "Running C demo..."
|
||||
ifeq ($(LINK_TYPE),shared)
|
||||
@echo "Setting library path for shared library..."
|
||||
LD_LIBRARY_PATH=.. DYLD_LIBRARY_PATH=.. ./$(TARGET)
|
||||
else
|
||||
./$(TARGET)
|
||||
endif
|
||||
|
||||
# Clean build artifacts
|
||||
clean:
|
||||
rm -f $(TARGET)
|
||||
rm -f ../libexport.a ../libexport.h ../libexport.so ../libexport.dylib
|
||||
|
||||
# Help target
|
||||
help:
|
||||
@echo "Available targets:"
|
||||
@echo " all - Build Go library and C executable"
|
||||
@echo " build-go - Build only the Go library"
|
||||
@echo " run - Build and run the C demo"
|
||||
@echo " clean - Clean all build artifacts"
|
||||
@echo " help - Show this help message"
|
||||
@echo ""
|
||||
@echo "Environment variables:"
|
||||
@echo " LINK_TYPE - Library type: 'static' (default) or 'shared'"
|
||||
@echo ""
|
||||
@echo "Examples:"
|
||||
@echo " make run # Use static library"
|
||||
@echo " LINK_TYPE=shared make run # Use shared library"
|
||||
179
_demo/go/export/use/main.c
Normal file
179
_demo/go/export/use/main.c
Normal file
@@ -0,0 +1,179 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
#include "../libexport.h"
|
||||
|
||||
int main() {
|
||||
printf("=== C Export Demo ===\n");
|
||||
fflush(stdout); // Force output
|
||||
|
||||
// Initialize packages - call init functions first
|
||||
github_com_goplus_llgo__demo_go_export_c_init();
|
||||
github_com_goplus_llgo__demo_go_export_init();
|
||||
|
||||
// Test HelloWorld
|
||||
HelloWorld();
|
||||
printf("\n");
|
||||
|
||||
// Test small struct
|
||||
main_SmallStruct small = CreateSmallStruct(5, 1); // 1 for true
|
||||
printf("Small struct: %d %d\n", small.ID, small.Flag);
|
||||
|
||||
main_SmallStruct processed = ProcessSmallStruct(small);
|
||||
printf("Processed small: %d %d\n", processed.ID, processed.Flag);
|
||||
|
||||
main_SmallStruct* ptrSmall = ProcessSmallStructPtr(&small);
|
||||
if (ptrSmall != NULL) {
|
||||
printf("Ptr small: %d %d\n", ptrSmall->ID, ptrSmall->Flag);
|
||||
}
|
||||
|
||||
// Test large struct - create GoString for name parameter
|
||||
GoString name = {"test_large", 10}; // name and length
|
||||
main_LargeStruct large = CreateLargeStruct(12345, name);
|
||||
printf("Large struct ID: %" PRId64 "\n", large.ID);
|
||||
|
||||
int64_t total = ProcessLargeStruct(large);
|
||||
printf("Large struct total: %" PRId64 "\n", total);
|
||||
|
||||
main_LargeStruct* ptrLarge = ProcessLargeStructPtr(&large);
|
||||
if (ptrLarge != NULL) {
|
||||
printf("Ptr large ID: %" PRId64 "\n", ptrLarge->ID);
|
||||
}
|
||||
|
||||
// Test self-referential struct
|
||||
main_Node* node1 = CreateNode(100);
|
||||
main_Node* node2 = CreateNode(200);
|
||||
LinkNodes(node1, node2);
|
||||
|
||||
int count = TraverseNodes(node1);
|
||||
printf("Node count: %d\n", count);
|
||||
|
||||
// Test basic types
|
||||
printf("Bool: %d\n", ProcessBool(1)); // 1 for true
|
||||
printf("Int8: %d\n", ProcessInt8(10));
|
||||
printf("Uint8: %d\n", ProcessUint8(10));
|
||||
printf("Int16: %d\n", ProcessInt16(10));
|
||||
printf("Uint16: %d\n", ProcessUint16(10));
|
||||
printf("Int32: %d\n", ProcessInt32(10));
|
||||
printf("Uint32: %u\n", ProcessUint32(10));
|
||||
printf("Int64: %" PRId64 "\n", ProcessInt64(10));
|
||||
printf("Uint64: %" PRIu64 "\n", ProcessUint64(10));
|
||||
printf("Int: %ld\n", ProcessInt(10));
|
||||
printf("Uint: %lu\n", ProcessUint(10));
|
||||
printf("Uintptr: %lu\n", ProcessUintptr(0x1000));
|
||||
printf("Float32: %f\n", ProcessFloat32(3.14f));
|
||||
printf("Float64: %f\n", ProcessFloat64(3.14));
|
||||
|
||||
// Test unsafe pointer
|
||||
int test_val = 42;
|
||||
void* ptr_result = ProcessUnsafePointer(&test_val);
|
||||
printf("UnsafePointer: %p\n", ptr_result);
|
||||
|
||||
// Test named types
|
||||
main_MyInt myInt = ProcessMyInt(42);
|
||||
printf("MyInt: %ld\n", (long)myInt);
|
||||
|
||||
// Test arrays
|
||||
intptr_t arr[5] = {1, 2, 3, 4, 5};
|
||||
printf("Array sum: %ld\n", ProcessIntArray(arr));
|
||||
|
||||
// Test complex data with multidimensional arrays
|
||||
main_ComplexData complex = CreateComplexData();
|
||||
printf("Complex data matrix sum: %" PRId32 "\n", ProcessComplexData(complex));
|
||||
|
||||
// Test interface - this is more complex in C, we'll skip for now
|
||||
printf("Interface test skipped (complex in C)\n");
|
||||
|
||||
// Test various parameter counts
|
||||
printf("NoParams: %ld\n", NoParams());
|
||||
printf("OneParam: %ld\n", OneParam(5));
|
||||
printf("ThreeParams: %f\n", ThreeParams(10, 2.5, 1)); // 1 for true
|
||||
|
||||
// Test XType from c package - create GoString for name parameter
|
||||
GoString xname = {"test_x", 6}; // name and length
|
||||
C_XType xtype = CreateXType(42, xname, 3.14, 1); // 1 for true
|
||||
printf("XType: %d %f %d\n", xtype.ID, xtype.Value, xtype.Flag);
|
||||
|
||||
C_XType processedX = ProcessXType(xtype);
|
||||
printf("Processed XType: %d %f %d\n", processedX.ID, processedX.Value, processedX.Flag);
|
||||
|
||||
C_XType* ptrX = ProcessXTypePtr(&xtype);
|
||||
if (ptrX != NULL) {
|
||||
printf("Ptr XType: %d %f %d\n", ptrX->ID, ptrX->Value, ptrX->Flag);
|
||||
}
|
||||
|
||||
// Test multidimensional arrays
|
||||
printf("\n=== Multidimensional Array Tests ===\n");
|
||||
|
||||
// Create and test 2D matrix [3][4]
|
||||
// Note: CreateMatrix2D returns [3][4]int32, but function returns need special handling in C
|
||||
printf("Testing 2D matrix functions...\n");
|
||||
|
||||
// Create a test 2D matrix [3][4]int32
|
||||
int32_t test_matrix[3][4] = {
|
||||
{1, 2, 3, 4},
|
||||
{5, 6, 7, 8},
|
||||
{9, 10, 11, 12}
|
||||
};
|
||||
int32_t matrix_sum = ProcessMatrix2D(test_matrix);
|
||||
printf("Matrix2D sum: %d\n", matrix_sum);
|
||||
|
||||
// Create a test 3D cube [2][3][4]uint8
|
||||
uint8_t test_cube[2][3][4];
|
||||
uint8_t val = 1;
|
||||
for (int i = 0; i < 2; i++) {
|
||||
for (int j = 0; j < 3; j++) {
|
||||
for (int k = 0; k < 4; k++) {
|
||||
test_cube[i][j][k] = val++;
|
||||
}
|
||||
}
|
||||
}
|
||||
uint32_t cube_sum = ProcessMatrix3D(test_cube);
|
||||
printf("Matrix3D (cube) sum: %u\n", cube_sum);
|
||||
|
||||
// Create a test 5x4 grid [5][4]double
|
||||
double test_grid[5][4];
|
||||
double grid_val = 1.0;
|
||||
for (int i = 0; i < 5; i++) {
|
||||
for (int j = 0; j < 4; j++) {
|
||||
test_grid[i][j] = grid_val;
|
||||
grid_val += 0.5;
|
||||
}
|
||||
}
|
||||
double grid_sum = ProcessGrid5x4(test_grid);
|
||||
printf("Grid5x4 sum: %f\n", grid_sum);
|
||||
|
||||
// Test functions that return multidimensional arrays (as multi-level pointers)
|
||||
printf("\n=== Testing Return Value Functions ===\n");
|
||||
|
||||
// Test CreateMatrix1D() which returns Array_int32_t_4
|
||||
printf("About to call CreateMatrix1D()...\n");
|
||||
fflush(stdout);
|
||||
Array_int32_t_4 matrix1d = CreateMatrix1D();
|
||||
printf("CreateMatrix1D() call completed\n");
|
||||
printf("CreateMatrix1D() returned struct, first element: %d\n", matrix1d.data[0]);
|
||||
|
||||
// Test CreateMatrix2D() which returns Array_int32_t_3_4
|
||||
printf("About to call CreateMatrix2D()...\n");
|
||||
fflush(stdout);
|
||||
Array_int32_t_3_4 matrix2d = CreateMatrix2D();
|
||||
printf("CreateMatrix2D() call completed\n");
|
||||
printf("CreateMatrix2D() returned struct, first element: %d\n", matrix2d.data[0][0]);
|
||||
|
||||
// Test CreateMatrix3D() which returns Array_uint8_t_2_3_4
|
||||
Array_uint8_t_2_3_4 cube = CreateMatrix3D();
|
||||
printf("CreateMatrix3D() returned struct, first element: %u\n", cube.data[0][0][0]);
|
||||
|
||||
// Test CreateGrid5x4() which returns Array_double_5_4
|
||||
Array_double_5_4 grid = CreateGrid5x4();
|
||||
printf("CreateGrid5x4() returned struct, first element: %f\n", grid.data[0][0]);
|
||||
|
||||
// Test NoReturn function
|
||||
// Note: This function takes a string parameter which is complex to pass from C
|
||||
// We'll skip it for now or pass a simple string if the binding allows
|
||||
printf("NoReturn test skipped (string parameter)\n");
|
||||
|
||||
printf("C demo completed!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user