| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX | | | | NX: Erste Schritte, ein Webinar am 24.01.2025
|
Autor
|
Thema: NXOpenC++ fatal error LNK1104 und LNK1168 beim kompilieren mit MS Visual Studio 2005 (3954 mal gelesen)
|
Zoechi Mitglied Software Entwickler
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 / zitieren --> Unities abgeben:
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
Beiträge: 126 Registriert: 03.09.2002
|
erstellt am: 29. Aug. 2008 09:43 <-- editieren / zitieren --> Unities abgeben: Nur für Zoechi
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
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 / zitieren --> Unities abgeben: Nur für Zoechi
|
Zoechi Mitglied Software Entwickler
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 / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für Zoechi
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
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 / zitieren --> Unities abgeben:
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
Beiträge: 111 Registriert: 21.12.2005 .
|
erstellt am: 09. Sep. 2008 11:45 <-- editieren / zitieren --> Unities abgeben: Nur für Zoechi
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 |
| Bauingenieur/Geowissenschaftler Schwerpunkt Tiefbau (m/w/d) | Gehen Sie mit CDM Smith auf Zukunftskurs! Für eine bessere, sichere & resiliente Welt ? Das ist unser Motto. CDM Smith ist ein unabhängiges, privates Ingenieurunternehmen für Planungs- und Bauleistungen rund um Wasser, Umwelt, Infrastruktur, Energie und Bauwerke. Mit Teamgeist und Leidenschaft arbeiten wir für die Zufriedenheit unserer Kunden und meistern mit intelligenten und nachhaltigen Lösungen die Herausforderungen des globalen Wandels.... | Anzeige ansehen | Feste Anstellung |
|
Zoechi Mitglied Software Entwickler
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 / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|