我正在尝试交叉编译mosquitto示例程序。起初我在Host PC上编译了mosquitto示例,它运行良好。 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
然后我添加以下行来交叉编译这个程序:
CXX=arm-unknown-linux-gnueabi-gcc
AR=arm-unknown-linux-gnueabi-ar
AS=arm-unknown-linux-gnueabi-as
LD=arm-unknown-linux-gnueabi-ld
RANLIB=arm-unknown-linux-gnueabi-ranlib
然后它会显示一条错误消息:
/home/Tools/tool_chain/bin/../lib/gcc/arm-unknown-linux-
gnueabi/5.4.0/../../../../arm-unknown-linux-gnueabi/bin/ld: main.o:
undefined reference to symbol '_ZdlPv@@GLIBCXX_3.4'
/home/Tools/tool_chain/bin/../sysroot/usr/lib/libstdc++.so.6:
error adding symbols: DSO missing from command line
我很困惑。我搜索了这个错误,但似乎没有一个相关。因为当我使用主机PC编译器编译时,一切正常。所以它不应该是一个lib问题。
更新: 所以我无法弄清楚发生了什么,然后我自己做了一个测试项目。 Makefile如下:(我忽略了交叉工具链变量部分以保存一些地方)
CFLAGS=-Wall -ggdb -I../../lib -I../../lib/cpp
LDFLAGS=-L../../lib ../../lib/cpp/libmosquittopp.so.1 ../../lib/libmosquitto.so.1
mqtt: main.o
${CXX} $^ -o $@ ${LDFLAGS}
main.o: main.cpp
${CXX} -c $^ -o $@ ${CFLAGS}
它有效吗?!我把它刷到了可执行程序似乎是正确的板上。
现在我更加困惑
答案 0 :(得分:1)
LD=arm-unknown-linux-gnueabi-ld
永远不要直接使用ld
。您希望使用g++
作为调用链接器的驱动程序,否则 会出现链接器问题。
LD=$(CXX)