Hallo zusammen,
ich möchte eine c -Library in mein c++ Proramm verwenden aber
ich habe eine Problem mit dem Linken von s SHARED_LIBS per Cmake :
Hier ist mein cmakeLists.txt:
1
cmake_minimum_required(VERSION 2.8)
2
3
SET(PNAME cprogram)
4
PROJECT(${PNAME})
5
6
include_directories (/usr/local/SGPx/include)
7
8
SET(SRCS prog.c)
9
ADD_EXECUTABLE(${PNAME} ${SRCS})
10
link_directories(usr/local/SGPx/lib)
I n Verzeichnis inculde befnidet sich die Headerdatei sgp.h und lib ist
die object files libsgp.a libsgp.so
hier ist die Meldung:
1
2
Scanning dependencies of target cprogram
3
[100%] Building C object CMakeFiles/cprogram.dir/prog.c.o
4
Linking C executable cprogram
5
CMakeFiles/cprogram.dir/prog.c.o: In function `spp_test':
6
prog.c:(.text+0x2f4): undefined reference to `Conver_Data'
7
prog.c:(.text+0x379): undefined reference to `sffcall'
8
prog.c:(.text+0x3b8): undefined reference to `smmp'
9
prog.c:(.text+0x3f7): undefined reference to `dd4'
kann mir da jamend weiterhelfen und zeigt wie ich die Library
includieren und linken kann.
Danke schönmal im voraus.
kano
PS :
wenn ich das Programm mit gcc in Terminal compiliere, meldet keine
fehler und zwar so:
Du musst die zu linkenden Libraries auch benennen:
target_link_libraries(${PNAME} sgplib)
link_directories(...) setzt nur die Verzeichnisse, in denen der Linker
nach zu linkenden Dependencies sucht.
RSp
Hallo Rene,
habe ich auch ausprobiert und meldet immer noch die gleich fehler:
[code]
cmake_minimum_required(VERSION 2.8)
SET(PNAME cprogram)
PROJECT(${PNAME})
include_directories (/usr/local/SGPx/include)
SET(SRCS prog.c)
add_executable(${PNAME} ${SRCS})
link_directories(/usr/local/SGPx/lib)
target_link_libraries(${PNAME} sgplib)
[\code]
Kano schrieb:> aber wie die meldung zeigt, der sucht nach der Library in /usr/bin
Wo zeigt die das?
> und die ist bei mir in usr/local/SGPx/lib, kan das sein das das problem
Ist sie auch tatsächlich da? Wie sieht dieses Verzeichnis aus?
Kann es sein dass du cmake den falschen Namen für die library nennst?
Im ersten Post schreibst du, dass sie den Namen libsgp.so hat. cmake
sagst du aber sgplib, wodurch der linker soweit ich weiß nach
libsgplib.so sucht. Also versuch es mal mit
target_link_libraries(${PNAME} sgp)
Damit soll's ja angeblich gehen:
Kano schrieb:> /cprog$ gcc prog.c -L/home/marx/program/cprog/sgplib -lsgplib
Da fällt allerdings auf, daß die Lib nicht in /usr/local/SGPx/lib
gesucht wird, sondern in /home/marx/program/cprog/sgplib.
Rolf Magnus schrieb:> Damit soll's ja angeblich gehen:>> Kano schrieb:>> /cprog$ gcc prog.c -L/home/marx/program/cprog/sgplib -lsgplib>> Da fällt allerdings auf, daß die Lib nicht in /usr/local/SGPx/lib> gesucht wird, sondern in /home/marx/program/cprog/sgplib.
Hallo Rolf;
es lauft wenn ich es mit gcc kompliere ohne problem:
Rene H. schrieb:> target_link_libraries(${PNAME}> sgp> )
ich habe es mit
target_link_libraries(${PNAME}
sgp
)
und bin weiter gekommen aber nun meldet beim Ausführen einen
speicherzugriffsfehler:
1
/cprog/build$ make
2
Scanning dependencies of target cprogram
3
[100%] Building C object CMakeFiles/cprogram.dir/prog.c.o
4
Linking C executable cprogram
5
[100%] Built target cprogram
6
cmax@hgens:~/projects/cprog/build$ ./cprogram
7
Speicherzugriffsfehler
8
cmax@hgens:
das kappier ich nicht, wenn ich das mit gcc kompliere, kann ich es ohne
problem ausführen.
Hallo zusammen,
ich muss doch noch an euch wieder anwenden,anscheined lasst mich dies
Link Problem nicht weiterkommen.
Nun habe ich die Source Endung ( .c) in (.cpp) geändert und schön wieder
taucht bei der Kompilierung die Linke Fehler.
hier ist CMakeLists.txt:
1
cmake_minimum_required(VERSION 2.8)
2
3
SET(PNAME cprogram)
4
PROJECT(${PNAME})
5
6
include_directories (/usr/local/SGPx/include)
7
link_directories(/usr/local/SGPx/lib)
8
9
SET(SRCS prog.cpp) #aenderung .c in .cpp
10
11
add_executable(${PNAME} ${SRCS})
12
13
target_link_libraries(${PNAME} sgp)
14
target_link_libraries(${PNAME} m)
Die Meldung von Compieler:
1
2
/cprog/build$ make
3
Scanning dependencies of target cprogram
4
[100%] Building CXX object CMakeFiles/cprogram.dir/prog.cpp.o
5
Linking CXX executable cprogram
6
CMakeFiles/cprogram.dir/prog.cpp.oIn function `spp_test':
7
prog.c:(.text+0x2f4): undefined reference to `Conver_Data'
8
prog.c:(.text+0x379): undefined reference to `sffcall'
9
prog.c:(.text+0x3b8): undefined reference to `smmp'
10
prog.c:(.text+0x3f7): undefined reference to `dd4'
wie gesagt wenn ich die saurce Endung mit .c versehen würde, meldet mir
keinen fehler.
danke schön mal im veraus für jede Hilfe
Gruß
Kano
Wenn Du die Endung cpp hast, komiliert er mit g++. Hast Du das schon mal
von Hand versucht?
Da wirst Du vermutlich ein Mangling/Demangling Problem mit Deiner
Library haben.
Grüsse,
René
Danke sehr Rene,
genau daran lag es. ....Super.
ich habe die Header-datei in extern gepackt.
gibts eine andere alternative ohne es in extern "C" zu packen.
Kano schrieb:> gibts eine andere alternative ohne es in extern "C" zu packen.
Nicht direkt.
1) Du nimmst den C Compiler, wenn Du ein C Projekt machst.
2) Du forcierst im cmake den C-Compiler zu nehmen, dann hast Du aber
kein C++ Projekt
Wenn Du C++ und C mischen willst, dann geht es nur mit external C. Sonst
passt es dem Linker nicht.
Schau mal ein c++ Binary mit nm <binary> an und dann mit nm <binary> |
c++filt (c++filt macht ein Demangling).
Die Symbole werden anderes zusammengesetzt in C++ (eben, name mangling).
Grüsse,
René
Noch eine Ergänzung für das Verständnis:
In C++ kann man Funktionen/Methoden überladen. Z.Bsp:
1
voidMyClass::func(uint8_ta)
2
{
3
4
}
5
6
voidMyClass::func(std::stringstr)
7
{
8
9
}
Damit der Linker zwischen den beiden func() unterscheiden kann, muss die
Signatur der Funktion/Methode in den Symbol Namen mit kompiliert werden.
Aus diesem Grund sind C++ und C Symbole nicht identisch.
Grüsse,
René