一个动态库项目,支持 win32 和 arm64 ,编译器是 msvc 和 gcc ( gcc 是自己从源码编译的,版本 15.1.0 ) 对外暴露一个标准 C API ,其内部实现只有一行代码,调用一个内部名称空间内的方法
int my_foo()
{
return internal::bar();
}
魔幻的事情是,这个 so 文件,我写一个控制台程序去调用它,能顺利进入到bar()
中,放到实际项目中bar()
根本就没有被调用,于是尝试打印
int my_foo()
{
std::cout << "111111111111111" << std::endl;
std::cout << __FUNCTION__ << std::endl;
std::cout << "internal::bar address: " << (long long)((void*)&internal::bar);
return internal::bar();
}
好家伙,在 linux 下只能打印前两行,然后函数返回 0 ,但这种情况只发生在项目引用时出现。写一个简单的命令行程序触发完全没问题,win32 下也都没问题。
我想 so 文件已经是二进制了,还能被链接它的程序优化不成?这里卡住了,不知道怎么办
项目均使用了-O2
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.