Seite 1 von 1
undefined reference fehler
Verfasst: Montag 18. Juli 2011, 14:15
von hypnoticum
Hallo,
ich habe ein Verzeichnis in dem sich eine Herader-Datei "Common.h" und dei zugehörige "Common.c" befinden.
Meine Setup-Scripte befinden sich in anderen Verzeichenissen.
Wenn ich jetzt in der Header Datei "#include Common.c" schreibe läuft alles sauber durch,
lasse ich das weg bekommme zu den in "Common.c" definierten Funktionen "undefined references".
was fehlt nir um nur mit einem "#include Common.h" in den Sourcen der Extensions die Funktionen nutzen zu können?
Danke
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 14:27
von BlackJack
@hypnoticum: Dazu müsstest Du dem Compiler mitteilen wo er die Include-Datei finden kann, falls er das nicht tut. Du schreibst ja leider nicht wo das Problem liegt, also was genau passiert wenn Du die ``Common.h`` inkludierst. Oder kommt der Fehler erst beim Linken? Da muss natürlich auch die ``Common.o`` mit eingebunden werden, die aus der ``Common.c`` übersetzt wurde.
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 15:01
von hypnoticum
@BlackJack:
Ja ich denke der Fehler tritt erst beim linken auf, denn die Fehlermeldung erwähnt auch die Object -Dateien.
running install
...
writing build\temp.win32-2.6\Release\c\Ext.def
C:\Program Files\pythonxy\mingw\bin\dllwrap.exe -mno-cygwin -mdll -static --entry _DllMain@12 --output-lib build\temp.win32-2.6\Release\c\libExt.a --def build\temp.win32-2.6\Release\c\Ext.def -s build\temp.win32-2.6\Release\c\gsm.o "-LC:/Program Files/IVI Foundation/VISA/WinNT/lib/msc" -LC:\Python26\libs -LC:\Python26\PCbuild -lvisa32 ... -lpython26 -lmsvcr90 -o H:\...\Ext.pyd
build\temp.win32-2.6\Release\c\gsm.o:GSM.c:(.text+0x79): undefined reference to `MsgDia'
(Ich habe teilweise Zeilen, Pfade und dateien durch "..." ersetzt)
aber wie weise ich den Kompiler an die "Common.c" mit zu übersetzen?
Wenn ich "sources = ['H:\...\Common.c'] schreibe, ändert sich nichts.
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 15:40
von deets
Wo ist denn MsgDia definiert?
Oh, und wenn du schreibst du setzt Pfade auf
H:\foo\bar
dann wird mir schon wieder schummerig - dir ist schon bekannt, dass der backslash in Python ein escape-character ist, und du den in Pfaden wahlweise doppelt setzen musst, oder raw-strings verwenden, oder gleich darauf verzichten & forward-slashes benutzen?
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 15:54
von hypnoticum
@Blackjack:
"MsgDia" ist in "Common.c" definiert. Die Backslashes sind im Orginalcode nach vorn gekippt und nur beim nachträgl. Bearbeiten des Pfades enstanden - sorry wenn dir jetzt schummrig ist

Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 16:36
von deets
Dann scheint Common.o nicht mit verlinkt zu werden. Woher kommt denn das gsm.c?
Und ich bin nicht BlackJack, ob dem schummerig ist kann ich nicht beurteilen...
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 16:52
von hypnoticum
Da hab ich schon wieder nicht aufgepasst. Entschuldigung deets.
Die Dateien "Common.h" und "Common.c" sind im Package "Device".
Das Package "Device" enthält das Package "CMU".
In "CMU" gibt es ein Verzeichnis "C", das "GSM.c" beinhaltet.
Code: Alles auswählen
import shutil
import sys
import os
from distutils.core import setup, Extension
sys.argv.append('install')
modul = Extension('Ext',
sources = ['C/GSM.c'],
depends = ['Common.h'],
include_dirs = ['H:/Python/Projects/Py_Workspace/PyAT/src/Device/C',
'C:/Program Files/IVI Foundation/VISA/WinNT/include',
'C:/Python26/include'],
library_dirs = ['C:/Program Files/IVI Foundation/VISA/WinNT/lib/msc'],
libraries = ['visa32', 'rscmu200', 'rscmuk6w', 'rscmuk2g'])
if os.path.isdir(os.getcwd() + '/build'):
try:
shutil.rmtree('build')
except:
print 'cant remove directory "build"'
try:
os.mkdir('build')
os.mkdir('build/lib.win32-2.6')
except:
print 'cant make directory "build/lib.win32-2.6"'
setup(
name = "GSM",
version = "1.0",
description = "C-Extensions for CMU-GSM-Modul",
ext_package = os.getcwd(),
ext_modules = [modul]
)
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 16:56
von BlackJack
@hypnoticum: Damit die ``Common.c`` übersetzt und gelinkt wird, müsste sie doch eigentlich auch in `sources` auftauchen, oder? Sonst weiss das Installationsskript doch gar nichts von deren Existenz.
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 17:19
von hypnoticum
ja, dass war was ich anfangs versucht hatte.
Im Moment habe ich einen anderen Fehler, weshalb ich das z.Zt. nicht mehr überprüfen kann:
... /Device/C/Common.C:1: error: expected constructor, destructor, or type conversion before '*' token
Zeile 1 von "Common.c": PyObject* MsgDia(void){ ...
(wahrscheinlich liegt es an der Python.h, die zu spät inkludiert wird)
eben hat es aber leider nicht gereicht ...
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 17:26
von deets
Na, du bist ja witzig. Ein Fehler beim kompilieren dadurch loesen, dass man *nicht* kompiliert, und sich dann wundern, warum's linken nicht geht?
Und der Fehler sieht etwas sehr seltsam aus, eine Funktionsdefinition in der ersten Zeile eines Stueckes C, mit PyObject* in der Signatur - da fehlt ja *mindestens* mal ein
#include "Python.h"
oder nicht?
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 17:39
von hypnoticum
wenn das mal alles so einfach gewesen wäre.
Jedenfalls klappt es jetzt.
Ich habe nicht erkannt, dass ich Header-Dateien auch mehrfach inkludieren muss, wenn ich mehrere Sourcen kompiliere.
ich wusste nicht, wo der Fehler lag. Ich hatte mich nicht gewundert warum es beim linken nicht ging. Aber ich wusste nicht wo mein Fehler war.
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 17:41
von BlackJack
Und da es eine ``Common.h`` gibt, sollte man die an der Stelle auch inkludieren. Mindestens mal, damit Redeklarationen mit anderer Signatur schon beim Übersetzen auffallen. Und wahrscheinlich wird auch dort ein Inkludieren der ``Python.h`` nötig sein. Dann braucht man das nicht mehr in der ``Common.c`` zu machen.
Re: undefined reference fehler
Verfasst: Montag 18. Juli 2011, 18:08
von deets
Im Sinne einer Vermeidung von kuenftigen Fehlern:
http://www.learncpp.com/cpp-tutorial/19-header-files/
http://www.learncpp.com/cpp-tutorial/11 ... processor/
Solltest du mal lesen, und vor allem im zweiten Link das Thema "header guards". Ich vermute mal stark, dein Common.h hat sowas nicht, oder?
Re: undefined reference fehler
Verfasst: Dienstag 19. Juli 2011, 08:32
von hypnoticum
@deets:
danke. header guards hatte ich schon verwendet.
Re: undefined reference fehler
Verfasst: Donnerstag 7. Juni 2012, 16:14
von Johnson
Hey! Das ist eine Super Tutorial-Seite! Werde ich mir mal abspeichern und bei Bedarf aufrufen

Re: undefined reference fehler
Verfasst: Donnerstag 7. Juni 2012, 17:50
von webspider
Um dir ein Lesezeichen hinzuzufügen musstest du doch nicht gleich den Totengräber spielen oder etwa doch?