Cmake Shared_Lib Link Problem

GreedyRaccoon

Grünschnabel
Hey Leute

Ich habe eine Problem mit dem Linken von selbst erstellten SHARED_LIBS per Cmake

Ich erstelle aus einem Visual Studio Projekt mittels CMAKE eine Shared LIB mit folgendem Code:
ADD_LIBRARY( Toolbox SHARED ${ToolboxSrcs})
so schön so gut, damit bekomme ich in meinem /release Ordner eine .lib und eine .dll datei

Diese würde ich jetzt gerne mit einem anderen Programm verwenden und verwende dafür folgenden CMAKE Code:

FIND_LIBRARY(TOOLBOX_VAR "Toolbox" SHARED_ONLY ../Toolbox/release/)
ADD_LIBRARY(TOOLBOX_LIB SHARED ${TOOLBOX_VAR})
SET_TARGET_PROPERTIES(TOOLBOX_LIB PROPERTIES LINKER_LANGUAGE CXX)
TARGET_LINK_LIBRARIES( TMSTools

${TOOLBOX_LIB}
.
.
.
.

)
Das Funktioniert soweit auch und in meinem TMSTools Projekt sehe ich die Toolbox lib auch integriert.

Beim Compilieren jedoch bekomme ich folgende Fehlermeldung die auch nach mittlerweile stundenlangem recherchieren nicht weggeht:
Error 2 error LNK2001: unresolved external symbol _DllMainCRTStartup TOOLBOX_LIB

Irgendjemand eine Idee? Such da jetzt wirklich schon lang dran,
danke, lg
Andreas
 
Danke für die Antwort

Wie überprüfe ich ob ich beide eingebunden habe / oder kann es sein, dass ich in der shared lib TOOLBOX irgendwo einen entry ponit definieren muss bzw wie sage ich dem compiler, dass es keinen entry point gibt?

vielen dank!
 
Gute Vermutung. Ja, es kann sein, dass du keinen EntryPoint definiert hast, denn folgende Meldung bestätigt das:
Code:
_DllMainCRTStartup
Ich glaube aber, dass jedes Programm einen EntryPoint haben muss.

Theoretisch könntest du auch einfach einen leeren EntryPoint machen:
C++:
// Ungefähr so

... ToolBoxEntryPoint(...)
{
  // Ist einfach nur so da
}
 
Einfach diese Funktion schreiben, z.B: so:
C++:
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, in  LPVOID lpvReserved)
{
  // Tue nichts
}

Aber eigentlich ist die Funktion dafür, gedacht etwas zu initialisieren oder zu löschen (z.B. Variablen).
Darf ich fragen, für was die ToolBox sein soll?
 
Sehr gerne darfst du fragen ;-)

Die toolbox soll eine Ansammlung grundlegender C++ Funktionen sein.

Also beispielsweise gibt es eine Klasse DataTool welche eine Sammlung statischer Funktionen für File/Folder Handling ist
Dann gibt es BasicTool welche eine Sammlung grundlegender Funktionen für string/integer/.... Handling ist.

Alle diese Klassen möchte ich in eine dll packen damit anschließend sie verwendende Programme die ganzen grundlegenden Funktionen nicht jedesmal neu compilieren müssen.
 
YICHA Ok habe jetzt folgendes unternommen:

Ich habe meinem Toolbox Project folgendes File hinzugefügt:

EntryPoint.cxx
------------------------------
#include <windows.h>
bool __declspec(dllexport) WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
// Tue nichts
}
-----------------------------

Weiters habe ich die CmakeLists erweiters:

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

neues Program welches Toolbox einbinden soll:
------------------------------
FIND_LIBRARY(TOOLBOX_VAR "Toolbox" SHARED_ONLY ../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\"")
------------------------------

und voila ! der Fehler ist mal fürs erste weg.

.... jetzt bleibt nur noch das Problem, wie ich auf die Funktionen in der dll zugreifen kann ... ?

ich exportere BasicTool.h beispielsweise so:

-----------------------
namespace Toolbox
{
class __declspec(dllexport) BasicTool
{
public:


static string intToString(int number);
static string doubleToString(double number);
.
.
.
---------------------------------

Was müsst ich jetzt im importierenden Project in einer Klasse schreiben damit ich auf intToString von BasicTool zugreifen kann?

vielen dank hat mich schon weiter gebracht
 
Zuletzt bearbeitet:
Ich habe folgendes gefunden: Click!

Also du machst noch eine Datei, z.B. "toolbox.h":
C++:
#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


#ifdef __cplusplus
extern "C"
{
#endif

  void DLL_EXPORT SomeFunction(const LPCSTR sometext);  // Deklariere hier deine Funktionen

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

Diese bindest du in dein Programm ein (per #include.
 
yeah danke step by step ;-)

das mit dem header hab ich schon öfter gesehen das dürfte so funktionieren

ich habe also eine DLLDefines.h mit dem ganzen "DLL_EXPORT ifdef" ... zeugs

und mein BasicTool folgendermaßen definiert:

class DLL_EXPORT BasicTool
{
public:


static string intToString(int number);
static string doubleToString(double number);
.
.
.
};


im neuen Projekt versuch ich BasicTool jetzt folgendermaßen zu importieren:
#ifdef __cplusplus
extern "C++"
{
#endif

class DLL_EXPORT BasicTool; // Deklariere hier deine Funktionen

#ifdef __cplusplus
}
#endif

.... er meckert zwar nicht, ich kann BasicTool aber immer noch nicht verwenden ... ^^

ne idee?
 

Neue Beiträge

Zurück