0

我正在尝试交叉编译 mosquitto 示例程序。起初我在主机 PC 上编译了 mosquitto 示例,它运行良好。生成文件如下:

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 编译器进行编译时,一切正常。所以它不应该是一个库问题。

更新:所以我无法弄清楚发生了什么,然后我自己做了一个测试项目。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}

它奏效了?!我把它刷到板上,可执行文件似乎是正确的。

现在我更加困惑

4

1 回答 1

1
LD=arm-unknown-linux-gnueabi-ld

永远不要ld直接使用。您想g++用作调用链接器的驱动程序,否则您遇到链接器问题。

LD=$(CXX)
于 2017-10-30T11:33:17.640 回答