2017-02-24 2 views
2

Ich versuche, die syslog Funktion in einer solchen Weise zu ersetzen:Warum der Linker meine Funktion nicht sieht (Makro als Ersatz für das Syslog definieren)?

#include <cstdio> 
#include <cstdarg> 

void syslog_printf(int level, char* format, ...) 
{ 
    va_list params; 
    va_start(params, format); 
    vprintf(format, params); 
    printf("\n"); 
    va_end(params); 
} 

#define syslog(...) syslog_printf(__VA_ARGS__) 

#include <modbus/modbus.c> 

Dies ist eine Auflistung meiner modbus.c pp Datei. Der Modbus. c ist auch da, aber ich kann es nicht ändern, weil es an mehreren Stellen verwendet wurde. Die modbus.cpp kompiliert rechts, aber der Linker meldet, dass es die syslog_printf Funktion nicht finden kann.

Die Frage ist einfach: warum?

EDIT:

make -k all 
Building file: ../modbus.cpp 
Invoking: GCC C++ Compiler 
g++ -std=c++0x -DDEBUG -I../../include -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"modbus.d" -MT"modbus.d" -o "modbus.o" "../modbus.cpp" 
Finished building: ../modbus.cpp 

Building target: fire 
Invoking: GCC C++ Linker 
g++ -o "fire" ./main.o ./modbus.o 
./modbus.o: In function `error_treat(modbus_param_t*, int, char const*)': 
../../include/modbus/modbus.c:144: undefined reference to `syslog_printf' 
./modbus.o: In function `modbus_send(modbus_param_t*, unsigned char*, int)': 
../../include/modbus/modbus.c:379: undefined reference to `syslog_printf' 
./modbus.o: In function `receive_msg(modbus_param_t*, int, unsigned char*, int*)': 
../../include/modbus/modbus.c:482: undefined reference to `syslog_printf' 
../../include/modbus/modbus.c:484: undefined reference to `syslog_printf' 
../../include/modbus/modbus.c:511: undefined reference to `syslog_printf' 
./modbus.o:../../include/modbus/modbus.c:524: more undefined references to `syslog_printf' follow 
collect2: error: ld returned 1 exit status 
make: *** [makefile:46: fire] Error 1 
make: Target 'all' not remade because of errors. 

EDIT:

Wenn ich versuche, die modbus.cpp zum modbus.c zu wechseln, bekomme ich diese:

make -k all 
Building file: ../modbus.c 
Invoking: GCC C Compiler 
gcc -DDEBUG -I../../include -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"modbus.d" -MT"modbus.d" -o "modbus.o" "../modbus.c" 
../modbus.c:13:21: error: conflicting types for ‘syslog_printf’ 
#define syslog(...) syslog_printf(__VA_ARGS__) 
        ^
../modbus.c:4:6: note: previous definition of ‘syslog_printf’ was here 
void syslog_printf(int level, char* format, ...) 
     ^~~~~~~~~~~~~ 
make: *** [subdir.mk:34: modbus.o] Error 1 
make: Target 'all' not remade because of errors. 
+2

Vermutlich vermissen Sie 'extern" C "{...}' – Ctx

+0

Haben Sie andere C-Dateien, die jetzt syslog_printf aufrufen, außer modbus.c? –

+0

@KlitosKyriacou, nein. –

Antwort

0

Die rechte Variante des "äußeren" modbus.c ist

Dank an alle von euch, kommentierte meine Frage.

+0

Ich bin mir nicht sicher, ob ich deine Antwort verstehe. Wollen Sie damit sagen, dass das Problem behoben wurde, indem vor der Definition von syslog_printf '' eingefügt wurde? –

+1

@KlitosKyriacou, ja, du hast (fast) recht. Ich könnte '#include ' vor dem' #define syslog ... 'einschließen, weil das" innere "modbus.c die Einfügung des' syslog.h 'auch enthält und diese Einschließung mein <#define syslog shadowing war ... 'in der ersten Variante. –

Verwandte Themen