【问题标题】:Cross-build, link issue交叉构建,链接问题
【发布时间】:2013-12-24 09:30:33
【问题描述】:

我必须构建一个在机顶盒上运行的小程序,为此我使用特定的构建工具链:toolchain-final-mipissa32r2el-timesys-linux-gnu

构建由两部分组成:一个 lib 静态 .a 文件和一个使用该库的可执行文件。

使用以下选项正确构建库:

mipsisa32r2el-timesys-linux-gnu-gcc -c --param max-inline-insns-single=2400 
-o ../../../build/LinuxHost_STB_release/_outLib/STB.o -O2 -fno-strict-aliasing 
-Winline -Wall -I../../../Modules -I../../../Source 
-I/opt/toolchains/toolchain-final-mipsisa32r2el-timesys-linux-gnu/include 
-I -fno-rtti ../../../Source/STBLib/STB.cpp

如果我在 libSTB.a 上运行 nm,我看到 STB.cpp 中的函数定义为:

 0000000000000124 T STB_Create
 0000000000000460 T STB_Destroy

为了编译和链接可执行文件,我使用以下命令行:

mipsisa32r2el-timesys-linux-gnu-c++ -o ../../../build/LinuxHost_STB_release/STBExample 
--sysroot=/opt/toolchains/toolchain-final-mipsisa32r2el-timesys-linux-gnu/ 
-I/opt/toolchains/toolchain-final-mipsisa32r2el-timesys-linux-gnu/include 
-L../../../build/LinuxHost_STB_release 
-lSTB ../../../Source/STBLib/STBExample.c

但我收到以下链接器错误:

STBExample.c:(.text+0x488): undefined reference to `STB_Create'

知道我在哪里犯了错误或如何调查吗?

【问题讨论】:

  • 翻转-lSTB../../../Source/STBLib/STBExample.c 参数。
  • 呼应@H2CO3 所说的。通常,库参数放在最后,尤其是静态库。
  • 有效地改变了链接器的输出,至少现在我得到了错误“未定义的引用”,但是对于内部数据和函数,还没有包含在我的文件列表中。谢谢。

标签: c++ c linux linker cross-compiling


【解决方案1】:

正如@H2CO3 和@Joe Z 所解释的,问题出在参数排序上。 使用 -l 设置的附加静态库必须放在 .c 文件之后。如下例所示,最后两个参数的切换解决了这个问题。

mipsisa32r2el-timesys-linux-gnu-c++ -o ../../../build/LinuxHost_STB_release/STBExample 
--sysroot=/opt/toolchains/toolchain-final-mipsisa32r2el-timesys-linux-gnu/ 
-I/opt/toolchains/toolchain-final-mipsisa32r2el-timesys-linux-gnu/include 
-L../../../build/LinuxHost_STB_release 
../../../Source/STBLib/STBExample.c -lSTB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2011-03-25
    • 2020-03-13
    • 2011-09-05
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多