如何重新编译现有的 linux 应用程序

Posted

技术标签:

【中文标题】如何重新编译现有的 linux 应用程序【英文标题】:How to recompile an existing linux application 【发布时间】:2015-11-04 18:05:25 【问题描述】:

我希望编辑和重新编译 bluez 5.31 版的 hcitool.c。我按照这个答案的过程安装了bluez 5.31: Bluetooth Low Energy in C - using Bluez to create a GATT server

在我的试用中,我复制了 hcitool.c 文件并在工具文件夹中将其命名为 myhcitool.c 并使用命令

gcc -o myhcitool.o myhcitool.c. 

这给了我一个错误

myhcitool.c:43:27: fatal error: lib/bluetooth.h: No such file or    directory
 #include "lib/bluetooth.h"
                       ^
compilation terminated.

我尝试将 myhcitool.c 复制到工具文件夹之外并在那里编译。这给了我一堆类似这样的错误:

/tmp/ccj1QmZK.o: In function `dev_info':
myhcitool.c:(.text+0x293): undefined reference to `ba2str'
/tmp/ccj1QmZK.o: In function `conn_list':
myhcitool.c:(.text+0x501): undefined reference to `ba2str'
myhcitool.c:(.text+0x50f): undefined reference to `hci_lmtostr'
myhcitool.c:(.text+0x586): undefined reference to `bt_free'
/tmp/ccj1QmZK.o: In function `cmd_dev':

我还尝试通过在其中修改一个简单的 printf 来编辑 hcitool.c 本身,然后为整个 bluez 重做“make”和“make install”命令。之后,当我尝试运行 hcitool 时,我所做的修改没有任何效果。

【问题讨论】:

你之前做过make clean吗? 没有。我现在才试了一下。 我刚刚尝试了“make clean”然后重做“./configure”、“make”和“make install”。我在hcitool中的修改还是没有生效。 应用程序具有构建系统,并且不只是由单个文件组成。你不能只复制一个文件并编译它。对原始文件进行编辑,然后运行标准的 configure/make/make-install 序列。 @davmac。如果我明白你的意思,我认为这就是我在我的一次试验中所做的,正如我在问题的最后部分所描述的那样。 【参考方案1】:

编译错误清楚地表明您缺少文件和目录,并且存在对类型的未定义引用(因为您缺少文件)。您正在将文件复制到其目录之外并尝试编译它。这将不起作用,因为缺少正确编译所需的包含(和更多)。

如果你想直接编辑 hcitool,你应该下载 Bluez 源,解压,cd./configure。将生成makefile,您可以使用make 来构建可执行文件。如果您更改 hcitool.c 文件,您应该确保重新编译它并在目录中以./hcitool 运行它,而不是像一般的hcitool 那样运行安装到您系统的可执行文件,而不是您运行的那个已编辑。

1234563 ,因为复制现有的可能行不通。

如果您想将新文件添加到 Bluez 源代码,请确保您还进行了正确的 Makefile 编辑,以便在编译期间包含它。

我想补充一点,hcitool 已经很久没有维护了,并且正在逐步淘汰 Bluez,所以也许您应该完全采用不同的方法!

【讨论】:

以上是关于如何重新编译现有的 linux 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何对现有的 linux 应用程序进行压力测试

Flex:如何重新使用现有的 TitleWindow 而不是打开另一个新的 TitleWindow?

如何将 winforms 对话框附加到现有的工具栏/菜单栏(编译的 C++ 应用程序)?

如何在 QT Creator 开源版本中为嵌入式 linux 交叉编译 qt

如何在windows上编译Tesseract OCR

现有的OnsenUI在Visual Studio上工作