Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com
[edit]
en __stdcall
[ Voor 9% gewijzigd door farlane op 26-01-2008 02:27 ]
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
2) configureer je compiler om C code (niet c++) te compilen, OF maak alles
1
| extern "C" { /*alles */ } |
3) configureer je linker om bepaalde symbols te exporten OF maak prefix de functies die je wilt exporteren met
1
| __declspec(dllexport) |
voorbeeld van iets simpels:
.h file
1
2
3
4
| extern "C" { __declspec(dllexport) int foo(void); } |
.c(pp) file
1
2
3
4
5
| #include ".h file" int foo(void) { return 42; } |
VB code (dit doe ik nooit, een quick google)
1
| Declare Function foo Lib "jedll.dll" () As Long |
[ Voor 34% gewijzigd door MLM op 26-01-2008 01:07 ]
-niks-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| C:\Program Files\Microsoft Visual Studio 9.0\VC\bin>cl "C:\Documents and Setting s\blabla\Bureaublad\dt_cc\mgrs\mgrs.c" /LDd Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.20706.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. mgrs.c Microsoft (R) Incremental Linker Version 9.00.20706.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:mgrs.dll /dll /implib:mgrs.lib mgrs.obj mgrs.obj : error LNK2019: unresolved external symbol _Convert_Geodetic_To_UTM re ferenced in function _Convert_Geodetic_To_MGRS mgrs.obj : error LNK2019: unresolved external symbol _Set_UTM_Parameters referen ced in function _Convert_Geodetic_To_MGRS mgrs.obj : error LNK2019: unresolved external symbol _Convert_Geodetic_To_UPS re ferenced in function _Convert_Geodetic_To_MGRS mgrs.obj : error LNK2019: unresolved external symbol _Set_UPS_Parameters referen ced in function _Convert_Geodetic_To_MGRS mgrs.obj : error LNK2019: unresolved external symbol _Convert_UPS_To_Geodetic re ferenced in function _Convert_MGRS_To_Geodetic mgrs.obj : error LNK2019: unresolved external symbol _Convert_UTM_To_Geodetic re ferenced in function _Convert_MGRS_To_Geodetic mgrs.dll : fatal error LNK1120: 6 unresolved externals |
Na zoekwerk naar error LNK2019 ben ik helaas niet tot een oplossing gekomen.
Het is toch lastiger om een bruikbare DLL te genereren dan ik dacht...
Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Dat is dus mijn probleem, ik heb nog nooit C++ geprogrammeerd, alleen VB. Ik dacht dat ik er wel uit kon komen, maar ik mis de basis voor C++ al...farlane schreef op zaterdag 26 januari 2008 @ 14:01:
Het is niet moeilijker dan het maken van een applicatie, ook daar moet je zorgen dat je de juiste object files en libraries meelinked.
En de C++ source die ik wil gebruiken is te groot en te ingewikkeld om het zelf om te zetten naar VB, dus dacht dat ik 'gewoon' maar even moest compileren en de DLL als reference toevoegen aan mijn VB project.
Dat 'gewoon' valt mij vies tegen...
Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com
Eindelijk weer eens iemand die zelf iets probeerd.Na zoekwerk naar error LNK2019 ben ik helaas niet tot een oplossing gekomen
Unresolved external symbol X referenced in function Y wil zeggen dat functie Y een functie gebruikt waarvan hij de source code (object file, of .c file) niet kan vinden. Deze heb je waarschijnlijk niet meegelinkt.
Dat maakt op zich niet uit, het compilatieproces is hetzelfde, alhoewel VB veel van de details voor je verbergt.Swerfer schreef op zaterdag 26 januari 2008 @ 14:43:
Dat is dus mijn probleem, ik heb nog nooit C++ geprogrammeerd, alleen VB.
Het idee achter een compilatie is ongeveer:
A pak een module ( .cpp in C++ of .bas/.cls/whatever in VB )
B compileer deze naar een object file ( .obj in zowel C++ als VB onder Windows )
C herhaal voor alle modules in je project
D voeg eventuele libraries toe
E link alle functieaanroepen naar het juiste functieadres in de juiste object file
F Voeg de startup code toe
G Klaar
Je zou voor de grap tijdens het compileren van je VB applicatie eens moeten kijken naar de directory waar je je project hebt staan, dan zie je de object files wel langskomen
Jij hebt nu het probleem dat de linker tijdens stap E functies niet kan vinden die wel gebruikt worden.
Als voorbeeld: Convert_Geodetic_To_MGRS gebruikt een functie Convert_Geodetic_To_UTM die de linker niet kan vinden, omdat de module niet wordt meegecompileerd naar een object file of omdat een eventuele library waarin die functie staat niet wordt opgegeven om te worden meegelinked.
Dus of je project is niet compleet ( .c file vergeten? ), of je linked bepaalde libraries niet mee.
BTW, een bestand met de extensie .c wordt door de MS compiler naar C code gecompileerd, niet naar C++ code.
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Maar ik ben al blij dat een deel van de functies WEL werken, en kan gebruiken vanuit VB...
Ik heb verder van alles geprobeerd om de overige functies wel werkend te krijgen, maar zoals jullie zeggen mis ik waarschijnlijk een link. (Ik heb ALLE .h en .c en .obj files gekopieerd die in de downloads in de TS stonden, maar dat maakte niks uit)
Helaas kom ik daar niet meer uit en wil ik vragen of iemand kan kijken of hij met de downloads in de TS wel de mgrs.c kan compileren, liefst met de visual studio 2008 command line compiler en mij kan uitleggen hoe ik hetzelfde resultaat kan genereren...
Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com
deze code gaat bijvoorbeeld wel compilen, maar niet linken:
1
2
3
4
5
6
7
8
9
10
11
12
| //Forward declaration void bar(); void foo() { bar(); } void main() { foo(); } |
je gaat een LNK2019 krijgn omdat bar niet gevonden gaat worden. Om dit op te lossen moet je een .obj of .lib extra linken waar de bar() functie in staat.
zelfde is bij jou het geval, je mist een paar functies, die wel nodig zijn. het meest waarschijnlijke is dat je een c file niet compileert, waardoor een .obj mist. Check of je alle files hebt, en of je al deze files ook echt laat compileren, en of die allemaal succesvol zijn. Ga dan pas linken (MSVC doet dit voor je)
-niks-
De functie Convert_Geodetic_To_UTM bijvoorbeeld staat in utm.c.Swerfer schreef op zaterdag 26 januari 2008 @ 17:36:
Helaas kom ik daar niet meer uit en wil ik vragen of iemand kan kijken of hij met de downloads in de TS wel de mgrs.c kan compileren, liefst met de visual studio 2008 command line compiler en mij kan uitleggen hoe ik hetzelfde resultaat kan genereren...
Een goede indicatie is dat vanuit jouw mgrs.c dit wordt gedaan:
1
2
| #include "ups.h" #include "utm.h" |
Maw, de functies die de linker zoekt zitten in ups.c en utm.c. Als jij op de commandline deze twee meegeeft naast mgrs.c dan zal het ongetwijfeld werken.
Het handigst is trouwens om even een projectje of makefile te maken.
[edit]
ups.c en utm.c gebruiken functies uit de andere source files zie ik nu .... je moet dus zo ongeveer alle source files die in de verschillende paden staan in je project invoegen.
[ Voor 14% gewijzigd door farlane op 27-01-2008 15:02 ]
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
What's the speed of Dark?
En de reden daarvoor is? Omdat het compilen niet meteen lukt?lzandman schreef op zondag 27 januari 2008 @ 00:24:
Als ik jou was zou ik op zoek gaan naar een alternatief. Die is er vast wel.
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Bedankt, door het toevoegen van onder andere ups.c en utm.c werkte het perfectfarlane schreef op zondag 27 januari 2008 @ 00:11:
[...]
Maw, de functies die de linker zoekt zitten in ups.c en utm.c. Als jij op de commandline deze twee meegeeft naast mgrs.c dan zal het ongetwijfeld werken.
Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com
Graag gedaanSwerfer schreef op zondag 27 januari 2008 @ 15:54:
Bedankt, door het toevoegen van onder andere ups.c en utm.c werkte het perfect
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Ik gebruik onderstaande code om een functie uit de DLL te declareren:
1
2
3
| Private Declare Function Convert_Geodetic_To_MGRS Lib "mgrs" _ (ByVal latitude As Double, ByVal longitude As Double, _ ByVal precision As Long, ByRef MGRS() As Char) As Long |
En onderstaande code om de functie aan te roepen:
1
2
3
| Dim MGRS(100) As Char Dim dummy As Long = Convert_Geodetic_To_MGRS(35.0, -75.0, 5, MGRS) Label16.Text = New String(MGRS) |
Het probleem is dat ik geen resultaat in MGRS krijg.
Ik ben begonnen met bij de declaratie ByRef MGRS as String, via ByRef MGRS() as Byte tot ByRef MGRS() as Char.
Ik dacht omdat de C-functie een Char array gebruikt, dat de laatste wel moest werken, maar nee...
Hieronder een stukje C uit de MGRS.h source:
1
2
3
4
| __declspec(dllexport) long Convert_Geodetic_To_MGRS (double Latitude, double Longitude, long Precision, char *MGRS); |
Wat zie ik over het hoofd?
Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com
In VB6 zou het zijn :
1
2
3
| Private Declare Function Convert_Geodetic_To_MGRS Lib "mgrs" _ (ByVal latitude As Double, ByVal longitude As Double, _ ByVal precision As Long, ByVal MGRS As String) As Long |
Omdat de VB6 runtime automatisch vertaald tussen Unicode( wat hij intern gebruikt ) en C style strings, en ook automagisch het adres van de string meegeeft. ( strings in VB6 hebben een lengte voor de eigenlijke data staan )
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Dat had ik als eerste geprobeerd, maar dat werkt niet.farlane schreef op maandag 28 januari 2008 @ 11:47:
Het kan geen Char zijn omdat een Char 2 bytes is terwijl een C char 1 byte is.
In VB6 zou het zijn :
Visual Basic:
1 2 3 Private Declare Function Convert_Geodetic_To_MGRS Lib "mgrs" _ (ByVal latitude As Double, ByVal longitude As Double, _ ByVal precision As Long, ByVal MGRS As String) As Long
Omdat de VB6 runtime automatisch vertaald tussen Unicode( wat hij intern gebruikt ) en C style strings, en ook automagisch het adres van de string meegeeft. ( strings in VB6 hebben een lengte voor de eigenlijke data staan )
Ook via Google kom ik tot de conclusie dat het wel zo zou moeten werken. Ik ga nog eens kijken of ik iets met het compileren ben vergeten...
Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com