【问题标题】:Cross compiling C++ project, Relocations in generic ELF (EM: 3)交叉编译 C++ 项目,通用 ELF 中的重定位 (EM: 3)
【发布时间】:2011-11-17 14:40:20
【问题描述】:

我从事 C++ 项目已有一段时间了,但想将其移植到我的 arm 处理器上。我已经拥有了所有的交叉编译工具(我正在使用 CodeSourcery),并且认为我可以更改我的 makefile 以指向该编译器。它使用默认的 g++ 编译良好,但是当尝试指向交叉编译器的 make 时,我得到重定位错误:

/home/oryan/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.2/../../../../arm-none-linux-gnueabi /bin/ld: ServerSocket.o: 通用 ELF 中的重定位 (EM: 3)
ServerSocket.o:无法读取符号:文件格式错误
collect2: ld 返回 1 个退出状态
make: *** [simple_server] 错误 1 ​​

似乎我没有设置正确的链接,或者它指向了错误的位置。我对 makefile 不是很熟悉,并且可能遗漏了一些明显的东西。我一直在使用的 makefile 来自 http://tldp.org/LDP/LG/issue74/tougher.html,删除了客户端:

# Makefile for the socket programming example
#

simple_server_objects = ServerSocket.o Socket.o simple_server_main.o

all : simple_server

simple_server: $(simple_server_objects)
         /home/matt/CodeSourcery/bin/arm-none-linux-gnueabi-g++ -o simple_server $(simple_server_objects)


Socket: Socket.cpp
ServerSocket: ServerSocket.cpp
simple_server_main: simple_server_main.cpp

clean:
        rm -f *.o simple_server

现在我正在手动编译每个文件,效果很好,但我想在这里进一步了解。

谢谢!

【问题讨论】:

    标签: c++ makefile cross-compiling


    【解决方案1】:

    问题是您已经将您的 makefile 设置为与新的 g++ 链接,但您并没有首先更改用于构建对象的编译器。

    解决此问题的最简单方法是将环境 CXX 设置为下一个编译器,即

    export CXX=/home/matt/CodeSourcery/bin/arm-none-linux-gnueabi-g++
    

    或者只是通过在命令行中添加CXX=... 来为给定的make 设置它。

    您需要先make clean,然后您将使用正确的编译器进行编译和链接。

    您还可以在 makefile 中指定新的 how-to-compile-C++ 文件规则来指定新的编译器,但环境变量更容易:

    .cc.o:
            /home/.../g++ $(CPPFLAGS) $(CXXFLAGS) -c
    

    【讨论】:

    • 我添加了 CXX 变量,它指向了很好的交叉编译器,但现在我得到了 /user/bin/ld: ServerSocket.o: Relocations in generic ELF (EM: 40)。所以我认为仍然存在一个错误,它没有指向我的交叉编译工具,而是查看了默认的 ld。
    • 嗯。我记得它是g++ -print-prog-name=ld 向您展示它正在使用哪个,但我不记得如何指定一个。我认为它会从与 cc1plus 相同的目录中选择一个 - 你在那个目录中有一个 ld(可能是 CodeSourcery/libexec/gcc/arm-none-linux-gnueabi/4.5.2/)吗?你确定为你的交叉编译器安装了 binutils 吗?
    • g++ -print-prog-name 只给了我“ld”。 cc1plus 也没有 ld 文件。但在 CodeSourcery/bin/ 中有一个 arm-none-linux-gnueabi-ld。也许是 arm-none-linux-gnueabi-ld 的软链接?
    • 软链接确实有效,但我认为这不是一个好的解决方案。现在交叉编译顺利进行,但是要在常规的旧 g++ 中编译,我需要终止软链接。所以为了避免一个头痛,我引起了另一个......
    • 抱歉,我没有忘记这一点 - 我想知道如何正确选择您自己想要的 ld,但我不知道答案。过几天我看看能不能搞定。
    【解决方案2】:

    问题在于这三个规则:

    Socket: Socket.cpp
    ServerSocket: ServerSocket.cpp
    simple_server_main: simple_server_main.cpp
    

    首先,规则的左侧应该是我猜的目标文件,所以应该有.o 后缀。

    第二个问题,很可能是问题的根源,是没有编译源文件的命令,这意味着make 将使用默认编译器而不是您的交叉编译器。

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 1970-01-01
      • 2021-09-14
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2021-09-05
      相关资源
      最近更新 更多