首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用CMAKE和arm工具链交叉编译CAN项目,但在查找AF_CAN PF_CAN时遇到问题。

使用CMAKE和arm工具链交叉编译CAN项目,但在查找AF_CAN PF_CAN时遇到问题。
EN

Stack Overflow用户
提问于 2016-10-19 20:26:39
回答 2查看 459关注 1票数 0

我使用CMAKE对嵌入式arm设备进行交叉编译,并在定义PF_CAN和AF_CAN时遇到了一些问题。有人建议我用

代码语言:javascript
运行
复制
sys/socket.h

但是它不包含定义,也不能真正判断它是否间接地指向它。

这是我目前的程序(超级简单)

代码语言:javascript
运行
复制
/* A simple SocketCAN example */

#include <cstdlib>
#include <stdio.h>
#include <cstring>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>

#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h> 
#include <pthread.h>
#include <assert.h>
#include <errno.h>
#include <iostream>

#include <sys/socket.h>  // i tried linux/socket.h and get some other errors, so I am confused.
#include <pthread.h>
#include <net/if.h>
#include <string.h>
#include <net/if.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <assert.h>
#include <linux/can.h>
#include <linux/can/raw.h>

int soc;
int read_can_port;

int open_port(const char *port)
{
    ifreq ifr;
    sockaddr_can addr;
   /* open socket */
soc = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if(soc < 0)
{
    return (-1);
}
addr.can_family = AF_CAN;
strcpy(ifr.ifr_name, port);
if (ioctl(soc, SIOCGIFINDEX, &ifr) < 0)
{
    return (-1);
}
addr.can_ifindex = ifr.ifr_ifindex;
fcntl(soc, F_SETFL, O_NONBLOCK);
if (bind(soc, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
    return (-1);
}
return 0;
}
int send_port(struct can_frame *frame)
{
   int retval;
   retval = write(soc, frame, sizeof(struct can_frame));
    if (retval != sizeof(struct can_frame))
    {
    return (-1);
    }
    else
    {
    return (0);
    }
}
/* this is just an example, run in a thread */
void read_port()
{
    struct can_frame frame_rd;
    int recvbytes = 0;
read_can_port = 1;
while(read_can_port)
{
    struct timeval timeout = {1, 0};
    fd_set readSet;
    FD_ZERO(&readSet);
    FD_SET(soc, &readSet);
    if (select((soc + 1), &readSet, NULL, NULL, &timeout) >= 0)
    {
        if (!read_can_port)
        {
            break;
        }
        if (FD_ISSET(soc, &readSet))
        {
            recvbytes = read(soc, &frame_rd, sizeof(struct can_frame));
            if(recvbytes)
            {
                printf("dlc = %d, data = %s\n",           
 frame_rd.can_dlc,frame_rd.data);
            }
        }
    }
}
}
int close_port()
{
close(soc);
return 0;
}
int main(void)
{
std::cout << "Hello World! " << std::endl;

open_port("can0”");
read_port();
return 0;
}

这是我运行make时的输出:

HelloWorld.cpp:45: error:“PF_CAN”未在此作用域中声明HelloWorld.cpp:45: PF_CAN:“PF_CAN”未在此作用域中声明

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-28 21:43:04

解决办法是增加

代码语言:javascript
运行
复制
#ifndef AF_CAN 
#define AF_CAN 29
#endif

这使得项目能够在没有错误的情况下构建。同时,在实际的目标设备上运行项目,并且正常运行。

票数 0
EN

Stack Overflow用户

发布于 2019-03-01 06:20:19

我刚刚遇到了同样的问题,不得不在代码中添加以下内容:

代码语言:javascript
运行
复制
#ifndef PF_CAN 
#define PF_CAN 29 
#endif 
#ifndef AF_CAN 
#define AF_CAN PF_CAN 
#endif 

这些值是在bits/socket.h.中通常定义的标准控制器区域网络协议族和地址族值。

我明白了为什么我需要这样做,并认为当其他人遇到这个问题时,它需要分享,因为这将是一个类似的原因。

在我的例子中,这是因为/opt/freescale/usr/local/gcc-4.3.50-eglibc-2.8.50/powerpc-linux-gnu/powerpc-linux-gnu/libc/usr/include/linux/socket.h定义了这些值,但是由于以下封装它们的编译宏,它们不再公开:

代码语言:javascript
运行
复制
#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)

代码中随后的一条评论,即“glibc的混乱将消失”,暗示着许多库将随着glibc更新而改变;不幸的是,工具链没有提供其他地方的这些定义,因此需要在代码中定义它们。

即。如果您使用的是旧的工具链,而在bits/socket.h,中找不到这些值,那么可能是时候更新您的工具链了,或者您需要像我必须的那样自己定义这些值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40140916

复制
相关文章

相似问题

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