【问题标题】:compiling a program that includes libmodbus in C在 C 中编译包含 libmodbus 的程序
【发布时间】:2014-03-27 19:37:38
【问题描述】:

我是 C 的新手...我写了一个非常简单的 modbus1.c,其中包括 libmodbus(我下载了它的源,解压缩,解压缩,./configure'd,make'd 和 make install'd 成功)。

当我尝试制作 modbus1.c 时,我得到了这个:

cc -Wall -g     modbus1.c   -o modbus1
Undefined symbols for architecture x86_64:
  "_modbus_close", referenced from:
      _main in modbus1-6cd135.o
  "_modbus_connect", referenced from:
      _main in modbus1-6cd135.o
  "_modbus_free", referenced from:
      _main in modbus1-6cd135.o
  "_modbus_new_tcp_pi", referenced from:
      _main in modbus1-6cd135.o
  "_modbus_read_bits", referenced from:
      _main in modbus1-6cd135.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [modbus1] Error 1

我正在运行OSX雪豹并且之前已经成功使用make编译过小程序(教程级程序......)这是我正在尝试编译的modbus1.c:

#include <stdio.h>
#include <stdlib.h>
#include <modbus.h>

int main(int argc, char *argv[]){
modbus_t *plc_client;

plc_client = modbus_new_tcp_pi("192.168.1.230","502");
if (plc_client == NULL) {
    fprintf(stderr, "Unable to allocate libmodbus context\n");
    return -1;
}
if (modbus_connect(plc_client) == -1) {
    fprintf(stderr, "Connection failed: \n");
    modbus_free(plc_client);
    return -1;
}
else if(modbus_connect(plc_client) == 0) {
    printf("MODBUS CONNECTION SUCCESSFUL\n");
}

uint8_t* catcher = malloc(sizeof(uint8_t));

if(modbus_read_bits(plc_client, 2000, 1, catcher)>0){
    printf("READ SUCCESSFUL");
}
else{
    printf("READ FAILED");
}

free(catcher);
modbus_close(plc_client);
modbus_free(plc_client);

return 0;
}

任何帮助将不胜感激!谢谢!

-尼可

【问题讨论】:

  • 您需要告诉编译器(实际上是链接器)在 modbus 库中链接,尝试将 -lmodbus 添加到您的编译行。
  • stackoverflow.com/questions/10409032/…的问题差不多,只是你链接的是modbus。
  • -lmodbus 不起作用。我确实在 libmodbus 的 git 上阅读了一些关于 ldconfig 的内容,并确保 /etc/ld.so.conf.d 具有所有必需的文件链接/关联......但我的机器在任何地方都没有 ldconfig(我检查了 $PATH 和 /etc )。我应该朝这个方向看吗?还是这无关?

标签: c linux makefile modbus


【解决方案1】:

试试这个

cc -Wall -g modbus1.c -o modbus1 -L/path/to/libmodbus -lmodbus

您应该将 /path/to/libmodbus 替换为系统中包含 libmodbus.dylib 的目录的实际路径。

【讨论】:

  • 我可以将我的 modbus.h 文件所在的路径放在我的位置,因为我正在运行 OSX,我不相信操作系统会维护用于链接的 .so 文件(如果我错了,请纠正我)
  • @nemo 后缀应为.dylib
  • 再次感谢您!但是在我阅读您的评论之前,我尝试使用它并将路径放到 .h 中,我将 #include-d 放在 .c 中,而不是它!
  • @nemo 也许 Mac 工具链做不同的事情。
  • 啊,是的,我确定!我并不是要抹黑你的回答,我只是想指出我可能“偶然发现”了另一种达到同样目的的方法。
猜你喜欢
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 2019-07-08
  • 2014-11-15
  • 2014-06-03
相关资源
最近更新 更多