与arm-linux-gnueabi-g ++交叉编译时,不会构造静态库中的全局对象

时间:2019-02-01 10:23:42

标签: c++ linux arm cross-compiling

我的主机是运行Ubuntu 18的x86 PC,并装有arm-linux-gnueabi-g ++和arm-linux-gnueabi-gcc套装。我原本打算在我的ARM(armv7l,Cortex-A17)设备上交叉编译并运行一个C ++项目。

为便于描述我的问题,已为测试项目设置了以下三个源文件:

//global.hpp
class Global { public: Global();};
extern Global global;

//global.cpp
#include "global.hpp"
#include <iostream>
Global global;
Global::Global(){std::cout << "Global" << std::endl;}

//main.cpp
#include <iostream>
int main(int nArgCnt, char *ppArgs[]) {
  std::cout << "main" << std::endl;
  return 0;
}

构建脚本“ build.sh”为:

#!/bin/bash
arm-linux-gnueabi-g++ -c global.cpp -o global.o
arm-linux-gnueabi-ar qc libglobal.a global.o
arm-linux-gnueabi-g++ -static main.cpp libglobal.a -o main

构建完成后,我将可执行文件“ main”推送到设备,运行它得到以下结果:

main

似乎没有调用Global的构造函数。

我试图直接将global.o链接到main,将build.sh修改为:

#!/bin/bash
arm-linux-gnueabi-g++ -c global.cpp -o global.o
arm-linux-gnueabi-g++ -static main.cpp global.o -o main

然后我得到了预期的结果:

Global
main

但这只是一个试验项目,实际上我有一个更大的项目,它有很多资源,必须使用静态链接进行构建。如何从libglobal.a中正确调用构造函数Global :: Global()?谢谢您的帮助!

如果我使用g ++和ar进行了构建,那么也不会期望得到结果:

#!/bin/bash
g++ -c global.cpp -o global.o
ar qc libglobal.a global.o
g++ -static main.cpp libglobal.a -o main
./main

得到

main

最后,问题Why doesn't attribute((constructor)) work in a static library及其解决方案确实起作用。

0 个答案:

没有答案
相关问题