2017-02-24 106 views
2

我尝试替代syslog功能以这样的方式:为什么链接器没有看到我的函数(用宏定义来代替syslog)?

#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> 

这是我modbus.c PP文件的列表。 modbus。 c也存在,但我不能修改它,因为它在几个地方使用。 modbus.cpp编译正确,但链接器报告它无法找到syslog_printf函数。

问题很简单:为什么?

编辑:

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. 

编辑:

如果我尝试了modbus.cpp切换到modbus.c,我得到这个:

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

您可能缺少'extern“C”{...}' – Ctx

+0

您是否还有其他C文件现在调用syslog_printf,而不是modbus.c? –

+0

@KlitosKyriacou,no。 –

回答

0

的“外部”modbus.c的右侧变体是

#include <stdio.h> 
#include <stdarg.h> 
#include <syslog.h> // I could include it earlier than the "inner" modbus.c will do... 

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> 

感谢大家,评论我的问题。

+0

我不确定我了解你的答案。你是说在syslog_printf的定义之前加入''来解决这个问题? –

+1

@KlitosKyriacou,是的,你(几乎)是正确的。我可以在'#define syslog ...'之前#include ',因为“内部”modbus.c也包含'syslog.h',这个包含了我的'#define syslog ... '在第一个变体中。 –

相关问题