2016-10-22 5 views
1

Ich habe Probleme herauszufinden, wie komplexere Bibliotheken zu einem NIM-Programm verknüpfen. Gegeben die folgenden Angaben enthalten Verzeichnisse (getrennt in verschiedenen Linien):Verknüpfung zu Vulkan in Nim

C:\Users\[user]\Documents\visual studio 2015\Libraries\glfw-3.2.bin.WIN32\lib-vc2015; 
C:\VulkanSDK\1.0.13.0\Source\lib32; 
C:\Users\[user]\Documents\Visual Studio 2015\Libraries\glfw-3.2.bin.WIN32\include; 
C:\VulkanSDK\1.0.13.0\Include\ 

Und dieses additonal Bibliothek Suchverzeichnis (das gleiche wie die ersten oben):

C:\Users\[user]\Documents\visual studio 2015\Libraries\glfw-3.2.bin.WIN32\lib-vc2015; 

Mit diesem Code:

#define GLFW_INCLUDE_VULKAN 

#include <GLFW/glfw3.h> 
//#include <stdio.h> 

GLFWwindow* init() { 
    glfwInit(); 

    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); 
    GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", NULL, NULL); 

    int extensionCount = 0; 
    vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL); 

    //printf("%d extensions supported\n", extensionCount); 

    return window; 
} 

void close(GLFWwindow* window) { 
    glfwDestroyWindow(window); 
    glfwTerminate(); 
} 

int shouldClose(GLFWwindow* window) { 
    return glfwWindowShouldClose(window); 
} 

void pollEvents() { 
    glfwPollEvents(); 
} 

int main() { 
    GLFWwindow* window = init(); 

    while (!shouldClose(window)) { 
     pollEvents(); 
    } 

    close(window); 
    return 0; 
} 

In Visual Studio 2015 mit den Eigenschaften von oben richtig eingestellt kann ich es ausführen und es wird ein leeres Fenster geöffnet.

Was muss getan werden, damit der äquivalente Code in reinem Nim läuft? Ich habe Gedanken darüber, wie ich es tun könnte, indem ich mit gcc nicht VS15 kompiliere, da der visuelle C-Compiler zu restriktiv scheint.

habe ich schrieb den folgenden Code nim eine DLL-Datei von VS15 in es ohne die Hauptfunktion, um zu versuchen verlinken:

{.link: "VulkanTest.dll".} 

proc pollEvents() {.importc, dynlib: "VulkanTest.dll".} 
proc init(): pointer {.importc, dynlib: "VulkanTest.dll".} 
proc close(window: pointer) {.importc, dynlib: "VulkanTest.dll".} 
proc shouldClose(window: pointer): cint {.importc, dynlib: "VulkanTest.dll".} 

var window = init() 

while shouldClose(window) != 0: 
    pollEvents() 

close(window) 

aber es einfach sagt, dass es die Datei nicht öffnen kann (die dll).

Gibt es Zeug, das ich in die Befehlszeile eingeben muss, damit es funktioniert? e.i. -l und -p (jede Verwendung von -p mir funktioniert haben einfiel, auch nicht nach den Schrägstrichen Umkehr und Veränderung des ; seperators nach dem Urls Unix-Stil : zu sein)

Was der equivilant der #define GLFW_INCLUDE_VULKAN der Umsetzung ist vor die #include <GLFW/glfw3.h> für den NIM-Compiler?

+0

'--passC',' -passL', '-cincludes',' -clibdir' und '-clib' scheinen für C-Code geeignet zu sein. Zeigen Sie trotzdem die Reihenfolge der Befehle ** Sie ** für Compile + Link verwenden. Und ursprünglicher Text des Fehlers. ;; Aktualisieren Sie Ihr VulkanSDK ;; Sie würden Konfigurationsmakros hinzufügen, z. als '-D'-Parameter für die' gcc'- oder VS-Eigenschaften oder im Quellcode bereitstellen, wie Sie es bereits haben. – krOoze

+0

Ich wechselte zu Linux und kompilierte meinen c-Code in eine .so-Datei (und änderte überall das .dll-Bit in .so). Ich habe das Pragma '{.passC:" -I/usr/lib/glfw-3.2.1/include -I/usr/lib/VulkanSDK/1.0.30.0/x86_64/include ".}' Hinzugefügt, jetzt sagt es die Zeilen in meinem c code von glfw und vulkan sind undefiniert. –

Antwort

0

aber es sagt einfach, dass es die Datei (die DLL) nicht öffnen kann.

Das bedeutet, dass die Datei VulkanTest.dll nicht im Suchpfad des Compilers verfügbar ist, den Sie als Backend (VC) verwenden. Sie können versuchen, den Pfad, unter dem sich die DLL befindet, mit --passL:"/LIBPATH:path" hinzuzufügen, wobei path der Pfad zu dem Ordner ist, der die DLL enthält.

Was ist der equivilant des Setzens der #define GLFW_INCLUDE_VULKAN vor dem # include für den nim Compiler?

Es ist unnötig, weil alle GLFW_INCLUDE_VULKAN den Vulkan-Header enthält. Aber Sie müssen die Procs deklarieren, die Sie auf der Nim-Seite aufrufen möchten. Es gibt eine GLFW3 wrapper und eine Vulkan wrapper, die das für Sie tun, aber ich glaube, die Vulkan Wrapper ist eher experimentell.