首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么链接器看不到我的函数(定义宏来替代syslog)?

为什么链接器看不到我的函数(定义宏来替代syslog)?
EN

Stack Overflow用户
提问于 2017-02-24 10:37:11
回答 1查看 309关注 0票数 2

我试图以这样的方式替换syslog函数:

代码语言:javascript
运行
复制
#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.cpp文件的清单。modbus.c也在那里,但是我不能修改它,因为它在几个地方都使用过。modbus.cpp编译正确,但是链接器报告它找不到syslog_printf函数。

问题很简单:为什么?

编辑:

代码语言:javascript
运行
复制
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,就会得到以下结果:

代码语言:javascript
运行
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-24 11:26:45

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

代码语言:javascript
运行
复制
#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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42436470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档