[英]How do I convert a normal Makefile to create a static executable that can be used on another computer
我得到了temp_conversion
从mosquitto C ++示例程序,从这里 。 我看过这个线程,但是我不太明白,我对makefile的经验很少。 我不确定静态库是否也可以这样工作,但是我有两个问题:
是否可以将可执行文件移至另一台PC并仍运行? (不在那里安装mosquitto库,也许用它复制由makefile创建的静态库)
如何转换此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.1
和libmosquitto.so.1
替换为静态版本来链接可执行文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.