Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  NX Programmierung
  NXOpenC++ fatal error LNK1104 und LNK1168 beim kompilieren mit MS Visual Studio 2005

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX
Autor Thema:  NXOpenC++ fatal error LNK1104 und LNK1168 beim kompilieren mit MS Visual Studio 2005 (3790 mal gelesen)
Zoechi
Mitglied
Software Entwickler


Sehen Sie sich das Profil von Zoechi an!   Senden Sie eine Private Message an Zoechi  Schreiben Sie einen Gästebucheintrag für Zoechi

Beiträge: 28
Registriert: 03.07.2008

NX 4.0.4.2 MP9, MS Visual Studio 2005, NX 4.0 Open C und MFC

erstellt am: 29. Aug. 2008 08:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo!

Habe mir über den Wizard in Visul Studio ein NX Open C++ Projekt erstellt und rufe nur die Funktion uc1601("Hallo Welt!", 1); auf.
--> kann das dann auch ohne Probleme kompilieren.

Wenn ich aber dann die DLL in NX ausführe (klappt auch alles), in meinem Programm eine kleine Änderung mache und dann wieder kompilieren möchte, bekomme ich die besagten Linker-Error.

mein Quellcode sieht so aus:

Code:

/* Include files */
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
#  include <strstream>
#  include <iostream>
    using std: strstream;
    using std::endl;   
    using std::ends;
    using std::cerr;
#else
#  include <strstream.h>
#  include <iostream.h>
#endif
#include <uf.h>
#include <ug_session.hxx>
#include <ug_exception.hxx>
#include <uf_ui.h>
#include <uf_exit.h>
#include <ug_info_window.hxx>

static void processException( const UgException &exception );


/*****************************************************************************
**  Activation Methods
*****************************************************************************/
/*  Unigraphics Startup
**      This entry point activates the application at Unigraphics startup */
extern DllExport void ufsta( char *param, int *returnCode, int rlen )
{
    /* Initialize the API environment */
    UgSession session(true);

    try
    {
        /* TODO: Add your application code here */
uc1601("Hallo Welt!", 1);
    }

    /* Handle errors */
    catch (const UgException &exception)
    {
        processException(exception);
    }
}

/*****************************************************************************
**  Utilities
*****************************************************************************/

/* Unload Handler
**    This function specifies when to unload your application from Unigraphics.
**    If your application registers a callback (from a MenuScript item or a
**    User Defined Object for example), this function MUST return
**    "UF_UNLOAD_UG_TERMINATE". */
extern int ufusr_ask_unload( void )
{
    return(UF_UNLOAD_UG_TERMINATE);
}

/* processException
      Prints error messages to standard error and a Unigraphics
      information window. */
static void processException( const UgException &exception )
{
    /* Construct a buffer to hold the text. */
    ostrstream error_message;

    /* Initialize the buffer with the required text. */
    error_message << endl
                  << "Error:" << endl
                  << ( exception.askErrorText() ).c_str()
                  << endl << endl << ends;

    /* Open the UgInfoWindow */
    UgInfoWindow: pen ( );

    /* Write the message to the UgInfoWindow.  The str method */
    /* freezes the buffer, so it must be unfrozen afterwards. */
    UgInfoWindow::write( error_message.str() );

    /* Write the message to standard error */
    cerr << error_message.str();
    error_message.rdbuf()->freeze( 0 );
}


Beim Kompilieren nachdem ich die DLL in NX gestartet habe bekomme ich folgende Meldung von Visual Studio:

Code:

Linking...
LINK : fatal error LNK1104: cannot open file 'Y:\InWork\Thomas\00_Sonstiges\cpp_test3\Release/cpp_test3.dll'
Build log was saved at "file://y:\InWork\Thomas\00_Sonstiges\cpp_test3\cpp_test3\Release\BuildLog.htm"
cpp_test3 - 1 error(s), 0 warning(s)
------ Build started: Project: cpp_test3, Configuration: Debug Win32 ------
Compiling...
cpp_test3.cpp
Linking...
LINK : fatal error LNK1168: cannot open Y:\InWork\Thomas\00_Sonstiges\cpp_test3\Debug/cpp_test3.dll for writing
Build log was saved at "file://y:\InWork\Thomas\00_Sonstiges\cpp_test3\cpp_test3\Debug\BuildLog.htm"
cpp_test3 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 2 failed, 0 up-to-date, 0 skipped ==========

Ich schätze mal, dass das Programm nicht richtig -->terminiert<--- wurde. Aber warum?
Ist da vielleicht ein Fehler im Wizard??

Ich hoffe ihr könnt mir helfen!

Gruß, Thomas

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

stefan.f
Mitglied



Sehen Sie sich das Profil von stefan.f an!   Senden Sie eine Private Message an stefan.f  Schreiben Sie einen Gästebucheintrag für stefan.f

Beiträge: 123
Registriert: 03.09.2002

erstellt am: 29. Aug. 2008 09:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Zoechi 10 Unities + Antwort hilfreich

Hallo Zoechi,
der Rueckgabewert in dieser Funktion

extern int ufusr_ask_unload( void )
{
    return(UF_UNLOAD_UG_TERMINATE);
}

besagt, dass die DLL erst beim Beenden von NX aus dem Speicher entfernt wird. Erst dann kannst du das Projekt neu erstellen.

Gruß
Stefan

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

hardyb
Mitglied
CAD/PLM Systembetreuung


Sehen Sie sich das Profil von hardyb an!   Senden Sie eine Private Message an hardyb  Schreiben Sie einen Gästebucheintrag für hardyb

Beiträge: 24
Registriert: 12.11.2004

NX 6.0.x
Win XP/XP64
SAP / ECtr 4.2

erstellt am: 30. Aug. 2008 01:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Zoechi 10 Unities + Antwort hilfreich

Hallo Thomas,

solange UG die DLL nicht "losläßt", kann der Linker sie nicht überschreiben.

ersetzt mal UF_UNLOAD_UG_TERMINATE durch UF_UNLOAD_IMMEDIATELY.

Gruss
Hardy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Zoechi
Mitglied
Software Entwickler


Sehen Sie sich das Profil von Zoechi an!   Senden Sie eine Private Message an Zoechi  Schreiben Sie einen Gästebucheintrag für Zoechi

Beiträge: 28
Registriert: 03.07.2008

NX 4.0.4.2 MP9, MS Visual Studio 2005, NX 4.0 Open C und MFC

erstellt am: 01. Sep. 2008 16:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

hallo stefan.f und hardyb!

danke für die antworten!

habe UF_UNLOAD_UG_TERMINATE durch UF_UNLOAD_IMMEDIATELY ersetzt, habe aber noch immer das gleiche problem.

Wenn ich nach dem try-catch-Block ein "UgSession::terminate();" anhäge, lässt er mir zumindest die Debug-Version los, nicht aber die Release-Version.

Code:

extern DllExport void ufsta( char *param, int *returnCode, int rlen )
{
    UgSession session(true);

    try
    {
        uc1601("Hallo Welt!", 1);
    }
    catch (const UgException &exception)
    {
        processException(exception);
    }
    UgSession::terminate();
}

extern int ufusr_ask_unload( void )
{
    return(UF_UNLOAD_IMMEDIATELY);
}


Mache ich noch etwas falsch?
Fehlt etwas???

fg
Thomas

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

hardyb
Mitglied
CAD/PLM Systembetreuung


Sehen Sie sich das Profil von hardyb an!   Senden Sie eine Private Message an hardyb  Schreiben Sie einen Gästebucheintrag für hardyb

Beiträge: 24
Registriert: 12.11.2004

NX 6.0.x
Win XP/XP64
SAP / ECtr 4.2

erstellt am: 01. Sep. 2008 21:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Zoechi 10 Unities + Antwort hilfreich

Hallo Thomas,

ich habe eben bei genauerem Hinsehen erst gemerkt, dass Du ja als Einstiegspunkt ufsta und nicht ufusr verwendest.

ufusr kannst Du mit unload entladen, aber ufsta Routinen sind dazu vorgesehen beim NX-Start mitgeladen zu werden und sind, soweit ich weiß,nicht vorgesehen  entladen zu werden.

Nimm mal ufusr, die kannst Du über Ctrl-U ausführen und die wird dann auch wieder entladen, oder warum nimmst du ufsta??

Gruss Hardy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Zoechi
Mitglied
Software Entwickler


Sehen Sie sich das Profil von Zoechi an!   Senden Sie eine Private Message an Zoechi  Schreiben Sie einen Gästebucheintrag für Zoechi

Beiträge: 28
Registriert: 03.07.2008

NX 4.0.4.2 MP9, MS Visual Studio 2005, NX 4.0 Open C und MFC

erstellt am: 02. Sep. 2008 10:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Zitat:
Original erstellt von hardyb:
...

Nimm mal ufusr, die kannst Du über Ctrl-U ausführen und die wird dann auch wieder entladen, oder warum nimmst du ufsta??

Gruss Hardy


Weil ichs nicht besser wusste und bis jetzt auch immer geklappt hat.
Habe bis jetzt immer ein mfc-dll-Projekt erstellt und diese Funktionen hinzugefügt:

Code:

extern "C" int ufusr_ask_unload( void )
{
    return( UF_UNLOAD_IMMEDIATELY );
}

extern "C" __declspec(dllexport) void ufsta( char *param, int *returnCode, int rlen )
{
    // Initialize the API environment

    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    UF_initialize();
    //... mein code
    UF_terminate();
}


Dann noch die Projekteinstellungen richig eingestellt, die Header hinzugefügt und es hat funktioniert.
Die dll wurde immer losgelassen, außer es war ein Fehler im Program.

Aber warum bleibt diese hängen?
Und warum nur die Release, und die Debug nicht?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Overcast
Mitglied



Sehen Sie sich das Profil von Overcast an!   Senden Sie eine Private Message an Overcast  Schreiben Sie einen Gästebucheintrag für Overcast

Beiträge: 111
Registriert: 21.12.2005

.

erstellt am: 09. Sep. 2008 11:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Zoechi 10 Unities + Antwort hilfreich

Denke, hier liegt schon ein Irrtum bzgl. der einzelnen Programmierschnittstellen vor.

Der Wizard erzeugt ein (altes) Open C++ Gerüst und nicht NXOpen C++!
Die NX Open C++ header werden aus dem NXOpen-Unterverzeichnis eingebunden, z.B.
#include <NXOpen/Session.hxx>

Die Funktion uc1601 dagegen ist eine (alte) Open C Funktion, womit wir beim 3. Programmierinterface wären 

Der einfachste Weg, sich einen NXOpen C++ Code zu erzeugen, ist das Aufzeichnen eines Journals in C++.
Dann erzeugt man ein C++ Gerüst mit dem Wizard (für die Projekteinstellungen) und ersetzt den Sourcecode.
Den Haken bei "Use Open C++ Calls" sollte man weglassen, um keinen Open C++ Code einzufuegen.

Ein minimaler NXOpen C++ Code könnte dann z.B. so aussehen:

Code:

#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/UI.hxx>
#include <NXOpen/NXMessageBox.hxx>
using namespace NXOpen;

extern "C" DllExport int ufusr_ask_unload()
{
  return (int)Session::LibraryUnloadOptionImmediately;
}

extern "C" DllExport void ufusr(char *param, int *retcod, int param_len)
{
  Session *theSession = Session::GetSession();
  Part *workPart(theSession->Parts()->Work());
  Part *displayPart(theSession->Parts()->Display());
  UI *theUI = UI::GetUI();
  NXMessageBox *mb = theUI->NXMessageBox();
  mb->Show("Test", NXOpen::NXMessageBox::DialogTypeInformation, "Hello World");
}


Hope this helps,
Frank.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP



Maschinenbautechniker (m/w/d) Mechanical Engineering

Die Marke FRITSCH steht seit Jahr­zehnten in der Bäckerei­technik für hoch­wertige und leistungs­fähige Anlagen sowie weg­weisende Innovationen. Mit unseren rund 500 Mitarbeitern arbeiten wir täglich mit Leidenschaft und Know-how daran, unsere Kunden welt­weit zu begeistern. FRITSCH ist seit 2019 Teil der MULTIVAC Gruppe, ein Unternehmen mit circa 7.000 Mitarbeitern weltweit, welches in über 80 Ländern durch eigene Tochter­gesell­schaften vertreten ist....

Anzeige ansehenMaschinenbau
Zoechi
Mitglied
Software Entwickler


Sehen Sie sich das Profil von Zoechi an!   Senden Sie eine Private Message an Zoechi  Schreiben Sie einen Gästebucheintrag für Zoechi

Beiträge: 28
Registriert: 03.07.2008

NX 4.0.4.2 MP9, MS Visual Studio 2005, NX 4.0 Open C und MFC

erstellt am: 08. Okt. 2008 07:13    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Ja, danke!
Das hilft mir weiter!

fg
Thomas

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz