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.
Vermutlich vermissen Sie 'extern" C "{...}' – Ctx
Haben Sie andere C-Dateien, die jetzt syslog_printf aufrufen, außer modbus.c? –
@KlitosKyriacou, nein. –