c - gcc gtk2和CANbus合并编译

标签 c gcc raspberry-pi gtk

我想编译其中包含 gtk2 和 linux canbus (PICAN 1.2) 编译的库

问题是这两个编译以不同的方式发生

canbus 应用程序在使用 make 命令的情况下进行编译:

gcc -c hello.c
gcc -o hello lib.o hello.o

这里使用了一个奇怪的 lib.o 文件,在 hello.c 中是一个 #include"lib.h"#include"terminal.h" ,当我尝试时:

$ gcc -Ihome/foo/linux-can-utils hello.c -o hello 

出现几个输出:

undefined reference to `fprint_canframe'
undefined reference to `fprint_long_canframe'

gtk2应用程序已编译:

gcc `pkg-config --cflags --libs gtk+-2.0` hello.c -o hello

其中 pkg-config 用作帮助工具

$ pkg-config --cflags gtk+-2.0 -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pango-1.0 -I/usr/X11R6/include -I/usr/include/freetype2 -I/usr/include/atk-1.0  
$ pkg-config --libs gtk+-2.0 -L/usr/lib -L/usr/X11R6/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -lXi -lgdk_pixbuf-2.0 -lm -lpangox -lpangoxft -lXft -lXrender -lXext -lX11 -lfreetype -lpango -latk -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0

最佳答案

首先,您应该了解您想要做什么的基本知识,以及 -I , -L ,和 -l gcc 选项用于。然后,当您在此处混合多个内容时,请忽略 GTK+ 方面,并尝试生成 candump 二进制文件。

这可以通过以下方式完成:

gcc candump.c lib.c -o candump

或者分割事物:

gcc -c candump.c                # compiles candump.c into candump.o
gcc -c lib.c                    # compiles lib.c into lib.o
gcc candump.o lib.o -o candump  # links candump.o and lib.o into the candump binary

undefined reference您收到的错误是因为您无法链接到二进制文件 candump.c使用 lib.c 中声明的函数。因此,当链接器尝试解析所有符号时,它会在 candump.o 中看到一些代码。想要调用fprint_canframe ,并且链接器无法在您提供给它的文件中的任何位置找到该函数。我不得不grep fprint_canframe *要查找该函数的定义位置,请参阅它在 lib.c 中,然后告诉 gcc。

现在手动获取由 2 .c 组成的单个二进制文件的参数文件是简单的情况。像 GTK+ 这样的东西是由多个库组成的,获得正确的参数可能很复杂。这就是pkg-config进入。一些项目(例如 GTK+)提供 .pc文件 pkg-config使用。它声明了它使用的不同选项、路径和依赖项。所以通过调用 pkg-config --libs gtk+-2.0你会看到-l提供给链接器的选项,以便它知道要链接哪个库以使用 GTK+ 2 库。 pkg-config --cflags --libs gtk+-2.0将给出 CFLAGS ,C 编译器标志,如 -I告诉在哪里可以找到包含文件的标志。这样当你这样做时:

#include <gtk/gtk.h>

编译器会知道 gtk目录可以在(例如) /usr/include 中找到,并且它将能够将其内容复制到您的 .c 中解析 #include 时的文件.

现在,如果您想要一个使用 GTK+ 的二进制文件,您只需提供所有依赖项:GTK+ 的依赖项和您的依赖项。要了解如何构建 GTK+ 2 应用程序,请阅读 Compiling GTK+ applications文档部分。

顺便说一句,GTK+ 2 确实很老了,很快就会失去维护。如果您打算学习 GTK+,则应该切换到 GTK+ 3。

关于c - gcc gtk2和CANbus合并编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49393950/

相关文章:

python - 多处理功能不写入文件或打印

MySQL 服务器无法在 Raspberry Pi 上启动

c - 如何接受文件中的信息并将其输入到数组中?

c - Unix 分支 : how many processes are created?

c - 发送消息不起作用

c++ - 无法在动态链接库中找到过程入口点 _ZNSt7_cxx1112basic_stringlcSt11char_traitslcESalcEEC1Ev

linux - 在 C++ 链接期间,在 Ubuntu 12.04 中找不到库

python - 从局域网访问sql数据库

c - C语言中如何在不知道输入大小的情况下读取输入?

gcc - CMake 相对包含 C++ 中的路径