在gcc目标机器上,当想要编译共享库时,需要指定-fpic或-fPIC来使事情正常工作.这是因为默认使用绝对寻址,它适用于完全控制自己的地址空间的可执行文件,但不适用于可以在可执行文件的地址空间中的任何位置加载的共享库.
然而,现代内核现在正在实现地址空间随机化,并且许多现代架构支持PC相对寻址.这似乎使绝对寻址不可用(地址空间随机化)或不需要(PC相对寻址).
我还注意到clang没有-fPIC选项,这使我不再需要它.
那么-fpic现在是多余的,还是需要生成单独的.o文件,一个用于静态库,一个用于共享库?
我在一个更大的程序中观察到类似的问题,可以使用下面的代码复制:
int main()
{
printf("starting application");
std::string str {"This is my string"};
printf("The last char is %d", (int)(str.at(str.size())));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这显然是一个未被捕获的崩溃std::range_error.
为了调试这个,我设置了Windows错误报告,正如预期的那样,它正在创建一个minidump.但是,当我将minidump加载到Visual Studio中以生成调用堆栈时,我得到以下内容:
msvcr120.dll!abort() Line 88 C
msvcr120.dll!terminate() Line 96 C++
test2.exe!__CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS * pPtrs) Line 39 C++
KERNELBASE.dll!_UnhandledExceptionFilter@4() Unknown
ntdll.dll!__RtlUserThreadStart() Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown
Run Code Online (Sandbox Code Playgroud)
这对于确定问题的根本原因是完全没用的.
我所追求的是一个像以下的callstack:
KernelBase.dll!_RaiseException@16() Unknown
[External Code]
msvcp120.dll!std::_Xout_of_range(const char * _Message) Line 24 C++
test2.exe!main() Line 16 C++
[External Code]
Run Code Online (Sandbox Code Playgroud)
(当使用调试器运行时)它标识std :: range_error发生的位置.有谁知道如何配置Windows错误报告,因此它不会像在顶部调用堆栈中那样隐藏错误?
我在使用g ++的Linux上使用Visual Studio 2013.应用程序核心转储,当核心在gdb中运行时,我得到一个调用堆栈,该调用堆栈将转到抛出异常的位置.
可能重复:
为什么C字符文字的内部而不是字符?
为什么在使用C时sizeof('x')返回4但sizeof('x')在C++中返回1?
C++通常只是C的超集,所以为什么这两个结果有所不同?
编辑 只是进一步澄清.这似乎是标准委员会的刻意举动,我认为如果没有充分的理由,就不会改变'x'的大小.我对原因感兴趣.
我正在寻找适用于Linux的系统范围的采样分析器.perf和OPrfile都使用相同的硬件计数器,所以我不确定两者之间有什么区别.
那么perf和OProfile之间的区别是什么?你何时会使用其中一个?
考虑一下代码:
use std::boxed::Box;
use std::mem::transmute;
trait Total {
fn total(&self) -> i32;
}
#[derive(Debug)]
struct S {
a: i32,
b: i32,
c: i32,
}
impl S {
fn new() -> S {
S { a: 2, b: 3, c: 4 }
}
}
impl Total for S {
fn total(&self) -> i32 {
self.a + self.b + self.c
}
}
fn main() {
let b: Box<Total> = Box::new(S::new());
unsafe {
let s: Box<S> = std::mem::transmute(b);
println!("S = {:?}", s);
} …Run Code Online (Sandbox Code Playgroud) 以下签名声明为std::forward重载:
template<class T> T&& forward(typename remove_reference<T>::type& arg) noexcept;
template<class T> T&& forward(typename remove_reference<T>::type&& arg) noexcept;
Run Code Online (Sandbox Code Playgroud)
现在,考虑以下模板函数:
template<class T> T&& foo_as_always(T&& t)
{
return std::forward<T>(t);
}
Run Code Online (Sandbox Code Playgroud)
如果我写:
int i = 0;
foo_as_always(i);
Run Code Online (Sandbox Code Playgroud)
然后这就是编译器实例化的foo_as_always方式T = int&:
int& foo_as_always(int& t)
{
// Does it call the first signature of std::forward(int&)
return std::forward<int&>(t);
}
Run Code Online (Sandbox Code Playgroud)
如果我写:
foo_as_always(0);
Run Code Online (Sandbox Code Playgroud)
那么编译器实例foo_as_always有T = int:
int&& foo_as_always(int&& t)
{
// Does it call the second signature of std::forward(int&&)?
return std::forward<int>(t); …Run Code Online (Sandbox Code Playgroud) 假设在下面的代码之前绘制了一些东西,下面的代码应该做什么?
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
Run Code Online (Sandbox Code Playgroud)
这段代码应该将alpha设置为1还是清除颜色缓冲区?
或者换句话说,确实glColorMask会影响什么glClear做或只适用于正常的绘图操作?
我特别询问OpenGL ES 2.0,因此任何对规范的引用都将受到赞赏.
我想编写一个通用实用程序函数,它将使用OpenGL Framebuffer对象创建一个纹理,某些OpenGL程序可以将其用于第三方程序员想要的任何目的.
让我们说参数赌注的功能看起来像
void createSpecialTexture(GLuint textureID)
{
MyOpenGLState state;
saveOpenGLState(state);
setStateToDefault();
doMyDrawing();
restoreOpenGLState(state);
}
Run Code Online (Sandbox Code Playgroud)
什么应该MyOpenGLState, saveOpenGLState(state),setStateToDefault()和restoreOpenGLState(state)模样,以确保doMyDrawing将正确的行为,并没有什么,我做doMyDrawing会影响其他任何第三方开发者可能会在做什么?
一直困扰我的问题是OpenGL有很多隐式状态,我不确定我是否正在捕获它.
更新:我主要关注的是OpenGL ES 2.0,但我想我会更普遍地提出这个问题
在RR调度策略中,如果低优先级线程锁定互斥锁并由调度程序删除,因为另一个高优先级线程正在等待,将会发生什么?
它还会释放低优先级线程所持有的锁吗?
例如,考虑在RR调度策略中优先级为10,20和30的进程中运行的3个线程.
现在在给定的时间点,低优先级线程1锁定互斥锁并且仍然执行执行意味着高优先级线程弹出并且还等待线程1持有的互斥锁.现在线程2进入图片,其中还需要锁定相同的互斥锁通过线程1.
据我所知,根据调度算法,线程正在休眠或等待互斥,信号量等被删除,其他的,即使具有低优先级也被允许执行.它是否正确?如果是这样,在上面的例子中,最终高优先级线程等待完成低优先级线程,这没有任何意义.如果在所有线程的设计都像我上面说的那样,系统是如何工作的?
或者线程优先级应该设置为高优先级不依赖于低优先级的互斥量?
也有人可以解释一下如何在进程级别进行调度吗?我们如何为流程设置优先级?
据我所知,cabal是构建Haskell项目的首选方式.来自unix C/C++背景,我习惯了.
那么cabal提供的是什么,我不会从make获得?