繁体   English   中英

如何转换普通的Makefile以创建可在另一台计算机上使用的静态可执行文件

[英]How do I convert a normal Makefile to create a static executable that can be used on another computer

我得到了temp_conversion从mosquitto C ++示例程序,从这里 我看过这个线程,但是我不太明白,我对makefile的经验很少。 我不确定静态库是否也可以这样工作,但是我有两个问题:

  1. 是否可以将可执行文件移至另一台PC并仍运行? (不在那里安装mosquitto库,也许用它复制由makefile创建的静态库)

  2. 如何转换此makefile使其成为静态的“可移动”可执行文件?

生成文件:

CFLAGS=-Wall -ggdb -I../../lib -I../../lib/cpp
LDFLAGS=-L../../lib ../../lib/cpp/libmosquittopp.so.1 ../../lib/libmosquitto.so.1

.PHONY: all clean

all : mqtt_temperature_conversion

mqtt_temperature_conversion : main.o temperature_conversion.o
${CXX} $^ -o $@ ${LDFLAGS}

main.o : main.cpp
    ${CXX} -c $^ -o $@ ${CFLAGS}

temperature_conversion.o : temperature_conversion.cpp
    ${CXX} -c $^ -o $@ ${CFLAGS}

clean : 
    -rm -f *.o mqtt_temperature_conversion

1)是的,如果它们运行相同的OS版本,则可以在一台计算机上进行编译,然后在另一台计算机上运行。 如果您没有在另一台计算机上安装第三方库,则需要编译该程序的静态版本。

2)要编译程序的静态版本,必须在最终的构建命令中添加-static选项。 这会指示链接程序使用库的静态版本(如果存在),包括标准C ++库。

这不适用于您当前拥有的内容,因为它要求您使用-l选项添加库。 -l选项告诉链接器在库搜索路径(由-L指定)中找到一个库。 Makefile会按文件名添加库,因此无论您指定任何其他选项,它都会始终使用该特定版本。

所以要修复您想要这样的东西

LDFLAGS=-L../../lib -L../../lib/cpp -lmosquittopp -lmosquitto

...这会将库所在的两个目录添加到搜索路径,然后说要与这两个库链接。 然后,如果您具有这些库的静态版本,则在添加-static标志时将使用它们。

您必须获取依赖项的静态版本,在这里libmosquittopp。 查找或安装静态库,例如“ libmosquittopp.a”(。a表示静态库)。 之后,通过将libmosquittopp.so.1libmosquitto.so.1替换为静态版本来链接可执行文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM