我的主机是运行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及其解决方案确实起作用。