Cmake Shared_Lib Link Problem

GreedyRaccoon hat gesagt.:
vielen dank hat mich schon weiter gebracht
yeah danke step by step ;-)
Ich will nicht irgendwie betteln, aber es gibt einen Danke-Button :D


Wie sieht denn dein Code aus, in dem du BasicTool verwenden möchtest.

In deinem DLL-Projekt solltest du ungefähr diese Dateistruktur haben:
  • BasicTool.cpp
  • AdvancedTool.cpp
  • ...
  • Defines.h

Jetzt versuche mal folgenden Code zu kompilieren/auszuführen:
C++:
#include "dll/defines.h"

int main()
{
  BasicTool::SayHello();
}

/* BasicTool::SayHello könnte so aussehen:
    
    void BasicTool::SayHello()
    {
      MessageBox(NULL, "Test", "Test", 0);
    }
*/

EDIT: Benutze doch bitte die C++ Tag: [code=cpp]Your code[/code]
 
es gibt einen Danke-Button

Tatsächlich ;-) *pressed*


Ok ich versuche hier mal meine Struktur aufzubauen

Die Idee ist es wie gesagt ein Bibliotheken System verschiedener Spezialisierung aufzubauen dass dann seperat von komplexen Anwendungen verwendet werden kann.

Im momentanen Fall ist es die "Grundlagen Bibliothek" Toolbox die von einer spezialisierteren Bibliothek "TMSTools" verwendet werden soll. Beide sollen dann in weiterer Folge von einer Application verwendet werden.

Die Struktur:

Toolbox:
C++:
==================================
>>> DLLDefines.h
#ifndef __MAIN_H__
#define __MAIN_H__
 
#include <windows.h>
 
/*  To use this exported function of dll, include this header
 *  in your project.
 */
 
#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif

#endif

==================================
>>>BasicTool.h
#include "DLLDefines.h"
// andere includes

namespace Toolbox
{
	class DLL_EXPORT BasicTool  
	{
		public: 
		
			
			static   string intToString(int number);
			static string	doubleToString(double number);
			static QString	intToQString(int number);
			static int		stringToInt(string text);
                         // some more functions
		};

}

==================================
>>>EntryPoint.h
#include <windows.h>
#include <BasicTool.h>
//#include "DLLDefines.h"
bool __declspec(dllexport)  WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason,  LPVOID lpvReserved)
{
  // Tue irgendwos
}

==================================
>>>CmakeLists.txt

ADD_LIBRARY( Toolbox SHARED ${ToolboxSrcs})
set_target_properties(Toolbox PROPERTIES  LINK_FLAGS "/ENTRY:\"DllMain\"")

TMSTools:
C++:
Besitzt die selbe DLLDefines.h

==================================
>>>InputTester.h
#include "DLLDefines.h"

using namespace std;
//==================================
//	INPUT DEFINITIONS
#ifdef __cplusplus
extern "C++"
{
#endif
 
	//string DLL_EXPORT intToString(int number);
  class DLL_EXPORT BasicTsdfsdfool;  // Deklariere hier deine Funktionen
 
#ifdef __cplusplus
}
#endif
//=================================

class  ImportTester
{
public:
	ImportTester();
	~ImportTester();
};
#endif

==================================
>>>ImportTester.cxx

#include "ImportTester.h"

ImportTester::ImportTester()
{
	string bla = BasicTool::intToString(1);
}

==================================
>>>CmakeLists.txt
FIND_LIBRARY(TOOLBOX_VAR "Toolbox"  ../Toolbox/release/)
ADD_LIBRARY(TOOLBOX_LIB SHARED   ${TOOLBOX_VAR})
SET_TARGET_PROPERTIES(TOOLBOX_LIB PROPERTIES LINKER_LANGUAGE CXX)
set_target_properties(TOOLBOX_LIB PROPERTIES  LINK_FLAGS "/ENTRY:\"DllMain\"")

--> Fehler Meldung dass BasicTool nicht bekannt ist
 
Danke für den Dank ;)

Du hast ja auch nicht in die "Defines.h" deine Klasse deklariert, so müsste es ausschauen:
C++:
==================================
>>> DLLDefines.h
#ifndef __DLLDEFINES_H__
#define __DLLDEFINES_H__
 
#include <windows.h>
 
/*  To use this exported function of dll, include this header
 *  in your project.
 */
 
#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif
 
 
#ifdef __cplusplus
extern "C"
{
#endif
 
  class BasicTool;
 
#ifdef __cplusplus
}
#endif
 
#endif // __DLLDEFINES_H__
==================================
Ich bin mir aber nicht ganz sicher, wie das mit dem namespace zu handhaben ist. Probier es einfach aus ;)

Du solltest eventuell die Namen bei den #defines abändern (habe ich hier schon gemacht)
 
Gern geschehen ;-)


Ok habe die DLLDefine.h jetzt so umgebaut und den namespace rund um BasicTool mal vorsorglich entfernt aber er erkennt BasicTool im InputTester.cxx immer noch nicht ....

Wie könnte ich denn überprüfen ob die dll überhaupt richtig geladen wurde? Gibts da einen Befehl?


update:

Ok ich bin mir sicher, dass die library richtig eingebunden ist weil:

Wenn ich im BasicTool.h direkt die Funktion mit dem Export befehl kennzeichne und dann

.) die Funktion im TMSTool direkt mit dem Export einbinde bekomme ich eine Fehler Funktion für ein unreferenced extern symbol
C++:
Error	2	error LNK2019: unresolved external symbol 
"__declspec(dllimport) class std::basic_string<char,struct 
std::char_traits<char>,class std::allocator<char> > __cdecl intToString(int)" 
(__imp_?intToString@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)
 referenced in function
 "public: __cdecl ImportTester::ImportTester(void)"
 (0ImportTester@@QEAA@XZ)	ImportTester.obj
.) eine beliebige nicht existierende Funktion verwende, bekomme ich ein Warning dass aus der Library nix importiert wird


Das selbe passiert auch beim importieren von BasicTool oder eben nicht

Importiere ich es nicht oder einen beliebigen Namen, gibt es das Warning
C++:
Warning	1	warning LNK4001: no object files specified; libraries used	TOOLBOX_LIB
Bei import BasicTool kein warning aber ich kanns noch nicht verwenden.....

... aahh ich glaub wir sind ganz nah dran
 
Zuletzt bearbeitet:
Ok habe die DLLDefine.h jetzt so umgebaut und den namespace rund um BasicTool mal vorsorglich entfernt aber er erkennt BasicTool im InputTester.cxx immer noch nicht ....

Was heißt "nicht erkennen". Heißt das, dass der Compiler sagt: "undefined type" oder so? Das kann irgendwie nicht sein, kannst du deine Dateien mal als ZIP hochladen?

Edit: Im DLL-Projekt, hast du da #define BUILD_DLL angegeben, denn sonst greifen nicht die Funktionen DLL_EXPORT in Defines.h?
 
Ich guck es mir mal an. Dann schreibe ich wieder hier rein.

Der Windows-Explorer meldet mir, dass der ZIP-Ordner ungültig sei! Lade ihn noch mal hoch
 
benens mal in *.rar um, habs in zip unbenannt weil ichs sonst nicht hochladen konnt

--> nochmal direkt als zip
 
Zuletzt bearbeitet:
Das Problem ist, es gibt zu wenige [DANKE] Buttons hier!

Boah ich hoffe echt, dass ich das irgendwann hinbekomme, sitze da echt schon lange dran.


DANKE DANKE DANKE !!
;-)
 
Es gibt noch die BEWERTEN-Buttons :-)

Es sind ziemlich viele Dateien und ich habe kein Visual Studio. Ich habe Code::Blocks, damit habe ich die "Solution" importiert. Doch der Compiler (MinGW) sagt, dass er einige Dateien (die mit "q" anfangen) nicht finden kann.

Naja, der Fehler besteht darin, dass dem Compiler der Typ BasicTool nicht bekannt ist. Bist du dir wirklich wirklich sicher (bei den ganzen Dateien, muss man mehrmals fragen ;)), dass du die "DLLDefines.h" eingebunden hast?
 
Zurück