在C语言中编译包含libmodbus的程序

在C语言中编译包含libmodbus的程序,c,linux,makefile,modbus,C,Linux,Makefile,Modbus,我是一个新手在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:

我是一个新手在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 snow leopard,以前曾成功地使用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;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
modbus_t*plc_客户端;
plc_客户端=modbus_new_tcp_pi(“192.168.1.230”、“502”);
如果(plc_客户端==NULL){
fprintf(stderr,“无法分配libmodbus上下文\n”);
返回-1;
}
如果(modbus_连接(plc_客户端)=-1){
fprintf(stderr,“连接失败:\n”);
无modbus_(plc_客户端);
返回-1;
}
否则如果(modbus_connect(plc_客户端)==0){
printf(“MODBUS连接成功\n”);
}
uint8_t*catcher=malloc(sizeof(uint8_t));
如果(modbus_读取位(plc_客户端,2000,1,捕捉器)>0){
printf(“读取成功”);
}
否则{
printf(“读取失败”);
}
自由(捕手);
modbus_关闭(plc_客户端);
无modbus_(plc_客户端);
返回0;
}
任何帮助都将不胜感激!谢谢

-Niko试试这个

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

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

您需要告诉编译器(实际上是链接器)链接modbus库,尝试将
-lmodbus
添加到您的编译行中。问题大致与,只有你在链接modbus。-lmodbus不起作用。我确实在libmodbus的git上读到了一些关于ldconfig的内容,并确保/etc/ld.so.conf.d具有所有必需的文件链接/关联。。。但是我的机器没有ldconfig(我检查了$PATH和/等)。我应该朝这个方向看吗?或者这是无关的?我可以把modbus.h文件的路径放在那里,但是因为我运行的是OSX,我不相信操作系统会维护。所以链接文件(如果我错了请纠正我)@nemo后缀应该是
.dylib
。再次感谢!但是在我读你的评论之前,我试着玩弄它,把路径放在.h中,我把-d包含在.c中,结果它成功了@尼莫也许Mac工具链可以做不同的事情。啊,是的,我肯定!我并不是要怀疑你的回答,我只是想指出,我可能“偶然发现”了另一种达到同样目的的方法。