如果你的共享库内部使用C++,那么std::
它引用的所有模板和类型都将导出为弱符号。即使您使用-fvisiblity=hidden
和-Wl,--exclude-libs,ALL
. 隐藏这些符号的唯一方法是使用版本脚本。
这些强制出口的目的是什么?
用版本脚本隐藏它们有什么坏处吗?
我正在尝试编译来自大型Dymola模型的生成C代码。生成的代码与人类编写的代码不同,存在许多展开的循环,大量使用了宏,手动索引了巨大的数组,最重要的是源文件很大(> 1e6行)。
当使用O2
或编译这些源文件时O3
,我的编译时间变得非常高:每个文件10至30分钟。Clang和GCC都有。我不能很好地遵循生成的汇编代码,因此我不确定优化的质量。通过不生成调试信息或关闭警告可以减少编译时间,但是与关闭优化相比,这些警告很小。在运行时方面,O0
和之间有明显的区别O2
,所以我不能证明这样做是合理的。使用进行编译时-ftime-trace
,我可以看到Clang前端负责90%以上的时间。据称,该过程不是内存瓶颈,它似乎完全受CPU限制htop
。
我可以做一些预处理来改善编译时间吗?将源文件分成较小的块会提高性能,为什么?编译器是否设计为可以处理这些巨大的源文件?还有其他我应该注意的编译选项吗?
令人惊讶的是,Windows上的MSVC /O2
花费的时间只是Clang和GCC的一小部分。
编译器参数示例: clang -m64 -Wno-everything -c -D_GNU_SOURCE -DMATLAB_MEX_FILE -ftime-report -DFMI2_FUNCTION_PREFIX=F2_Simulations_SteadyState_SteadyState2019MPU_ -DRT -I/opt/matlab/r2017b/extern/include -I/opt/matlab/r2017b/simulink/include -I/mnt/vagrant_shared/<path>/Source -I/mnt/vagrant_shared/<path>/export -fexceptions -fPIC -fno-omit-frame-pointer -pthread -O0 -DNDEBUG -std=c99 /mnt/vagrant_shared/<path>/some_file.c -o /mnt/vagrant_shared/<path>/some_obj.obj
平台:在虚拟机VM上运行的CentOS 7。Clang 7,GCC 4.8(由于其他要求,我坚持使用这些旧版本)。
我正在尝试编写这个非常简单的加法程序以供练习。
它接受输入列表并将其存储在向量中。然后它从向量中取出每个连续的元素并求和。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> i;
int input;
int sum = 0;
int y = 0;
while (std::cin >> input && input != 0000) {
i.push_back(input);
}
for (y; y < sizeof(i); y++) {
sum = sum + i[y];
}
std::cout << sum;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我编译并运行程序时,它可以正常工作,直到 for 循环开始运行,然后编译器停止并吐出向量下标超出范围的消息?
我做错了什么?
这是一个简化的 C++ 程序,将 4 个字节转换为它们的 IEE754 浮点表示。
#include <iostream>
#include <math.h>
#include <memory.h>
uint8_t bytes[4] = {0x40, 0xd5, 0xc6, 0x7f}; // 0x40d5c67f
float f;
int main()
{
memcpy(&f, &bytes[0], 4);
printf("%.*lf", 5, f);
}
Run Code Online (Sandbox Code Playgroud)
它的输出是nan
!isnan
也为它返回true。这是怎么发生的?0x40d5c67f 是 6.6804...
在我的类似 arduino 的微控制器和http://cpp.sh/ 上都会发生