funktion einbinden



  • Hi,
    ich habe ein Programm das in c geschrieben ist, nun hab ich weiteres programm das ich mit visualstudio 2005 in c++ geschrieben habe, beides Konsoleanwendung.

    Nun würde ich gern in meinem C-Projekt die Fumktion benutzen, aber es klappt nicht. Ich bin wie folgt vorgegangen.

    simpack_wrapper_master.c

    #include "ipc_common_extern.h"
    #include <stdio.h>
    #include <string.h>
    #include "windows.h"

    extern void getFDMU_id(char *fdmu_id);

    int main(int argc, char **argv)
    {
    char fdmu_id[MAX_PATH];
    getFDMU_id(fdmu_id);
    }

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <windows.h>
    using namespace std;

    getFDMU_id.cpp

    void getFDMU_id(char *fdmu_id)
    {
    int a;
    char *fdmu_;
    const char *p;
    char *inputFilePath;
    inputFilePath = getenv("WINDOW_REGULATOR");
    strcat(inputFilePath,"\\CarDoor.ifx");
    ifstream inputFileStream(inputFilePath);
    if (!inputFileStream){
    cerr << "Could not open " << inputFilePath << " for reading " << endl;
    }

    string line,cutline;
    while (getline(inputFileStream, line))
    {
    if (line.find("FDMU-") != string::npos )
    {
    a=line.find("FDMU-");
    cutline=&line[a];

    }
    }
    p=cutline.c_str();
    strcpy(fdmu_id,p);
    }

    die Fehlermeldung die ich erhalte beim kompilieren ist die folgende:

    2>simpack_wrapper_master1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_getFDMU_id" in Funktion "_main".
    2>..\output_debug\SimpackWrapperMaster.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    bin dankbar für jede idee.


  • Mod

    Sieht so aus, als ob die C/CPP Datei nicht in das Projekt eingefügt wurde.



  • Und wenn es das nicht ist, dann bist Du ggfs. Opfer des C++ Name Mangling geworden. Das behebst Du mit:

    extern "C" void getFDMU_id(char *fdmu_id);
    

    Das dürfte aber eigentlich (ohne Rumspielerei an den Compiler-Optionen) nur dann passieren, wenn Du Deine Funktion in einem .c File hast.



  • erstmal danke für eure antworten, wenn ich

    extern "C" void getFDMU_id(char *fdmu_id);

    hinzufüge erhalte ich folgenden Fehler

    3>c:\test\msmodule_simpack-0.5\simpackwrappermaster\src\simpack_wrapper_master.c(6) : error C2059: Syntaxfehler: 'Zeichenfolge'

    #include "ipc_common_extern.h"
    #include <stdio.h>
    #include <string.h>
    #include "windows.h"

    extern "C" void getFDMU_id(char *fdmu_id);

    int main(int argc, char **argv){....}



  • Das extern "C" ist dazu da, um das C++-Namemangling zu deaktivieren, also musst Du es auch im C++-File angeben. Der C-Compiler kann damit nichts anfangen.



  • Schreib mal:

    getFDMU_id.cpp

    extern "C" void getFDMU_id(char *fdmu_id)
    {
        int a;
        char *fdmu_; 
        ....
    }
    

    und lass das .c File so wie es war.



  • entschuldige ich bin nicht der superprogrammierer, ich hab das in der cpp nun so dann auch angegeben aber bekomme die gleiche fehlermeldung.

    3>c:\test\msmodule_simpack-0.5\simpackwrappermaster\src\simpack_wrapper_master.c(6) : error C2059: Syntaxfehler: 'Zeichenfolge'

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <windows.h>

    using namespace std;

    extern "C" void getFDMU_id(char *fdmu_id)
    { ...}

    zu der Projektmappe gehört eine header in der extern c schonmal angegeben ist, kann das zu einem konflikt führen?
    #pragma once

    #ifdef __cplusplus
    extern "C"
    {
    #endif /* ifdef __cplusplus */

    #ifdef TEST_EXPORTS
    #define TEST __declspec(dllexport)
    #else
    #define TEST __declspec(dllimport)
    #endif

    TEST bool connect();
    TEST bool disconnect();

    TEST bool put();
    TEST bool take();

    #ifdef __cplusplus
    }
    #endif /* ifdef __cplusplus */



  • Es hat jetzt geklappt hatte vor der main auch noch das "C" drinne, nach dem ich es raus gemacht hab liefs.

    super ich danke euch

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <windows.h>

    using namespace std;

    extern "C" void getFDMU_id(char *fdmu_id)
    { ...}

    .
    .
    .

    #include "ipc_common_extern.h"
    #include <stdio.h>
    #include <string.h>
    #include "windows.h"
    extern void getFDMU_id(char *fdmu_id);

    int main(int argc, char **argv)
    {
    char fdmu_id[MAX_PATH];
    getFDMU_id(fdmu_id);
    }


Anmelden zum Antworten