交叉编译无法链接 Curl 和 Crypto
Posted
技术标签:
【中文标题】交叉编译无法链接 Curl 和 Crypto【英文标题】:Cross Compile Cannot Link Curl and Crypto 【发布时间】:2018-04-05 14:13:42 【问题描述】:我通过sudo apt-get install arm-linux-gnueabihf
安装了 arm-linux-gnueabihf,我想为 Raspberry Pi 进行交叉编译。
我的make文件是这样的:
arm-linux-gnueabihf-g++ *.cpp *.h b64.c -o file -lcurl -lcrypto -lpthread -lssl
然后发生了这样的错误:
/usr/arm-linux-gnueabihf/bin/ld: cannot find -lcurl
/usr/arm-linux-gnueabihf/bin/ld: cannot find -lcrypto
我也尝试链接-L/usr/lib/x86_64-linux-gnu/libcurl.so
,但仍然是同样的错误。
我也不明白为什么 libssl a 是链接的,而其他的却没有。
如何将这些库链接到 arm-linux-gnueabihf? 谢谢。
【问题讨论】:
两个问题:第一个是-L
选项是指定一个目录来搜索库。第二个是您似乎想将 host 库与您的程序链接,这将不起作用,因为它与您的目标不匹配。
非常感谢您的快速回复。如何将宿主库链接到我的程序?
【参考方案1】:
您不能将 x86-64 位库与 arm-linux-gnueabihd 链接。 您需要获取 curl 和 crypto 的 gnueabihf 库。 一种方法:交叉编译 curl 和加密库,使用 -L 指定交叉编译的 libcurl.so 和 gnuaebihf 机器的 libcrypto.so 所在的目录。 另一种方法:将 libcurl.so 和 libcrypto.so 从 raspberrypi 复制到您的计算机上,使用 -L 指定它们所在的目录并尝试编译,它应该可以工作。 ssl 和 pthread 是链接的,因为您提供了为 gnueabihf 架构编译的 ssl 和 pthread 库。在 /usr/arm-* 中查找这些文件,可能在 /usr/arm-linux-gnueabihf/lib 中。 一般来说,对于初学者来说,只需在你的树莓派上编译你的程序(安装 curl 和加密),它会为你省去很多麻烦。
-L/usr/lib/x86_64-linux-gnu/libcurl.so
行无效。您不使用 -L 命令行指定文件,而是指定包含 libcurl.so 的目录。此外,您在使用 gnueabihf 编译器时使用 x86-64 架构特定库指定了目录,它们将不起作用,它们不兼容,不。您不能将 x86_64-linux-gnu/libcurl.so
或任何 x86-64 库与 gnueabihf 程序链接。
交叉编译的整个想法是为另一种架构进行编译。你不要混合这些架构,因为它们彼此不兼容,就像你不能在你的树莓派上运行 x86-64 程序一样,你不能在你的计算机上运行一个树莓派程序。两种架构的机器代码互不兼容。
当您为 gnueabihf 架构编译程序时,您需要链接 gnuabihf 库并使用 gnuabihf 目标文件并使用将生成 gnueabihf 特定机器代码的编译器。当您为 x86-64 机器编译程序时,您需要链接 x86-64 库并使用 x86-86 目标文件并使用将生成 x86-64 机器代码的编译器。
可能对您来说也值得,使用file 命令来确定文件类型。你可以运行file /usr/lib/x86_64-linux-gnu/libcurl.so
来查看这个 libcurl.so 是一个 x86-64 共享对象。
【讨论】:
以上是关于交叉编译无法链接 Curl 和 Crypto的主要内容,如果未能解决你的问题,请参考以下文章
cmake:arm-xm-linux交叉编译工具链文件及交叉支持HTTPS的curl静态库
cmake:arm-xm-linux交叉编译工具链文件及交叉支持HTTPS的curl静态库