小编Jac*_*oyd的帖子

如何使用binutils链接器处理静态库之间的递归依赖?

我正在将现有系统从Windows移植到Linux.构建由多个静态库构成.我遇到了一个链接错误,其中在libB的对象中找不到符号(在libA中定义).链接器行看起来像

g ++ test_obj.o -lA -lB -o test

当然是由时间链接器找到它需要从利巴符号的问题,它已经过去了吧,不会重新扫描,因此它只是出现了错误,即使符号是有服用.

我最初的想法当然是简单地交换链接(到-lB -lA),以便之后扫描libA,并且拾取libA中缺少的任何符号.但后来我发现libA和libB之间实际上存在递归依赖关系!我假设Visual C++链接器以某种方式处理它(默认情况下是否重新扫描?).

处理这个问题的方法我考虑过:

  • 使用共享对象.不幸的是,从需要PIC补偿的角度来看这是不可取的(这是性能敏感的代码并且丢失%ebx以保持GOT真的会受到伤害),并且不需要共享对象.

  • 构建所有对象的一个​​巨大的ar,避免问题.

  • 重构代码以避免递归依赖(这显然是正确的事情,但我试图用最小的更改来做这个端口).

你有其他想法来解决这个问题吗?有没有什么方法可以说服binutils链接器执行它已经在缺少符号时已经查看过的库的重新扫描?

linker dependencies gcc static-libraries binutils

15
推荐指数
2
解决办法
5926
查看次数

在C/C++中,volatile变量是否保证最终在线程之间具有一致的语义?

任何通常遵循的标准(ISO C或C++,或任何POSIX/SUS规范)是否有任何保证,由多个线程访问的变量(可能标记为volatile)(未被互斥锁保护)将最终保持一致如果分配给?

要提供一个特定示例,请考虑共享变量v的两个线程,初始值为零.

线程1:v = 1

线程2:while(v == 0)yield();

线程2是否保证最终终止?或者它可以想象永远旋转,因为缓存一致性从未启动并使得赋值在线程2的缓存中可见?

我知道C和C++标准(在C++ 0x之前)完全没有关于线程或并发的说法.但我很好奇,如果C++ 0x内存模型,或pthreads,或其他任何东西,保证这一点.(显然这确实可以在Windows上运行32位x86;我想知道它是否可以依赖于某些东西,或者它是否恰好在那里工作).

c c++ multithreading portability memory-model

10
推荐指数
2
解决办法
2441
查看次数

从非常大的未排序列表中获取最大X数字的最快方法?

我试图从我的程序生成的分数列表中获得最高分100分.不幸的是,这个列表非常庞大(大约数百万到数十亿),因此排序是该计划的一个时间密集型部分.

什么是进行排序以获得前100名得分的最佳方式?

到目前为止,我能想到的唯一两种方法是首先将所有分数生成一个大型数组,然后对其进行排序并取得前100名.或者第二,生成X个分数,对其进行排序并截断前100个分数然后继续生成更多分数,将它们添加到截断列表中,然后再次对其进行排序.

无论哪种方式我都这样做,它仍然需要比我想要更多的时间,任何关于如何以更有效的方式做到这一点的想法?(我以前从未参加过编程课程,也许那些有comp sci学位的人都知道有效的算法来做到这一点,至少那是我所希望的).

最后,c ++中标准sort()函数使用的排序算法是什么?

谢谢,

-Faken

编辑:只为好奇的人...

我在之前和之后进行了几次试验,结果如下:

旧程序(每次外循环迭代后的预先排序):

top 100 scores: 147 seconds
top  10 scores: 147 seconds
top   1 scores: 146 seconds
Sorting disabled: 55 seconds
Run Code Online (Sandbox Code Playgroud)

新程序(仅实现对最高分的跟踪并使用默认排序功能):

top 100 scores: 350 seconds <-- hmm...worse than before
top  10 scores: 103 seconds 
top   1 scores:  69 seconds 
Sorting disabled: 51 seconds
Run Code Online (Sandbox Code Playgroud)

新的重写(存储数据的优化,手写排序算法):

top 100 scores: 71 seconds <-- Very nice!
top  10 scores: 52 seconds
top   1 scores: 51 seconds
Sorting disabled: 50 seconds
Run Code Online (Sandbox Code Playgroud)

完成核心2,1.6 GHz …

c++ sorting optimization visual-c++

9
推荐指数
3
解决办法
4147
查看次数

在具有不同分配器的向量之间转换

我编写了一个简单的C++ 11样式的有状态分配器类型.特定

template<typename T> class my_allocator {
   // the usual stuff
};

template<typename T> using my_vector = std::vector<T, my_allocator<T>>;

my_vector<int> x;

std::vector<int> y = x; // error
Run Code Online (Sandbox Code Playgroud)

什么是允许从转换的最佳方式my_vectorstd::vector使用默认的分配?GCC 4.7(最近的svn)说

error: conversion from 'my_vector<int> {aka std::vector<int, my_allocator<int>>}' to non-scalar type 'std::vector<int>' requested

显然,这可以通过简单的转换函数来完成,例如

template<typename T> std::vector<T> to_std_vec(const my_vector<T>& v)  {
   return std::vector<T>(&v[0], &v[v.size()]);
   }
Run Code Online (Sandbox Code Playgroud)

但这看起来非常不优雅.在C++ 11中有更好的解决方案吗?

当然,在这种情况下,移动语义是正确的,但我希望复制构造和分配工作而不会产生额外的噪音/打字.

c++ allocator c++11

9
推荐指数
2
解决办法
2750
查看次数

Emacs按模式自定义背景颜色

我使用emacs来编辑许多文件类型,并且想要一个简单的可视队列来告诉.vhd或.py文件中的.c文件.如何为该语言的主要模式添加自定义背景颜色?

emacs elisp

6
推荐指数
2
解决办法
1917
查看次数

在C/C++应用程序中分析过多代码大小的一些技术或工具是什么?

我有一个C++库,可以生成更大的代码,我真的期望它正在做什么.从不到50K的源代码行中,我获得了大约4 MB的共享对象和静态归档推送9.这是有问题的,因为库二进制文件非常大,更糟糕的是,甚至连接它的简单应用程序通常会获得500到1000 KB代码大小.使用像-Os这样的标志编译库有点帮助,但不是很多.

我还尝试了GCC的-frepo命令(尽管我见过的所有文档都表明Linux上的collect2将会合并重复的模板)和模板上的显式模板实例化似乎"可能"重复很多,但是没有两种情况都有实际效果.当然,我说"可能",因为,与任何类型的剖析一样,这样的盲目猜测几乎总是错误的.

是否有一些工具可以轻松地分析代码大小,或者其他一些方法我可以找出占用这么多空间的东西,或者更一般地说,我应该尝试的其他任何东西?在Linux下工作的东西是理想的,但我将采取我能得到的东西.

c++ linux gcc code-size

5
推荐指数
1
解决办法
1276
查看次数

如何让$(/ bin/printf -6)返回-6并且不认为-6是一个选项

我有一个bash shell脚本,其中包含以下行:

g=$(/bin/printf ${i})
Run Code Online (Sandbox Code Playgroud)

${i}包含类似的东西时-6,printf认为它被传递了一个选项.它无法识别该选项,因此会产生错误.

如果用${i}引号括起来,printf仍然认为它被传递了一个选项.

g=$(/bin/printf "${i}")
Run Code Online (Sandbox Code Playgroud)

如果我转义引号,变量$g则保持" -6",这不是我想要的.

g=$(/bin/printf \"${i}\") 
Run Code Online (Sandbox Code Playgroud)

有没有逃脱破折号( - ).

printf是一个BusyBox应用程序

bash shell printf busybox

4
推荐指数
2
解决办法
2277
查看次数

用于优化特定指令集的连接法线形式表达式的算法?

我正在使用Espresso逻辑最小化器来生成一组布尔方程的最小化形式.然而,我不是为可编程阵列逻辑(通常用于Espresso)生成逻辑,而是希望在标准微处理器上实现这些逻辑.麻烦的是,Espresso以连接的正常形式产生输出,这对于PAL来说是完美的,但对于x86或PPC来说却不是最佳的.

例如,Espresso完全忽略XOR - 在下面的Espresso输出中,子表达式(!B0&!B1&B2&!B3) | (!B0&!B1&!B2&B3)相当于(!B0&!B1&(B2^B3)).这种替换确实增加了表达式的门深度/关键路径,但是考虑到我正在查看具有足够数量项的表达式来完全饱和任何CPU周围的执行资源,似乎有必要权衡一些门深度以减少总的#指令.我还想扩展它以了解如何使用ANDC或NOR等指令,这些指令可以在我感兴趣的某些处理器上使用.

我正在看的CNF表达式示例:

O0 = (B0&!B1&!B2&B3) | (!B0&B1&B2&B3) | (!B0&!B1&B2&B3) | (B1&!B3) | (!B0 &!B2&!B3);

O1 = (B0&B1&!B2&B3) | (B0&!B1&B2&!B3) | (B0&B1&B2&!B3) | (!B0&!B1&B2&!B3) | (!B0&!B1&!B2&B3) | (!B0&!B1&B2&B3) | (!B0&!B2&!B3);

O2 = (B0&!B1&!B2&B3) | (B0&!B1&B2&!B3) | (B0&B1&B2&B3) | (!B0&B1&!B3) | (!B0&!B2&B3) | (!B0&!B1&B2&B3);

O3 = (!B0&B1&!B2&!B3) | (B0&B1&B2&B3) | (!B0&B1&B2&B3) | (B0&B1&B2&!B3) | (B0&!B1&!B2) | (!B0&!B1&B2&!B3) | (!B0&!B1&!B2&B3);
Run Code Online (Sandbox Code Playgroud)

所以,这是一个实际的问题; 按优先顺序排列:

你知道Espresso的选项或扩展名会产生我想要的那种表达吗?

您是否知道任何可以理解(或可以教授)各种门类型的布尔逻辑最小化工具,而不仅仅是为PAL制作CNF?

您是否知道使用其他类型的门将CNF表达式转换为表达式的算法?

如果你不知道它的算法,你知道或者可以想到任何有用的启发式方法吗?

(并且,以防万一你建议它 - 测试显示GCC和ICC(或者,我敢打赌,现有的任何其他C编译器)都不够聪明,不能从CNF表达式为我做特定于处理器的最小化 - 这真的很不错,但是检查两个-O3 -S的输出显示它们甚至无法捕捉到可以使用XOR的情况.

algorithm optimization boolean-logic conjunctive-normal-form

4
推荐指数
1
解决办法
3840
查看次数

为什么nvcc找不到我的Visual C++安装?

我在Core i5上运行Windows 7 Pro x64,NVIDIA 3100m,兼容CUDA.

我尝试过从NVIDIA安装32位和64位CUDA工具包,不幸的是,他们中的任何一个都无法编译任何东西; nvcc说"找不到支持的cl版本.只支持MSVC 8.0和MSVC 9.0".

我通过Windows 7 SDK(两个拱门的编译器版本15.00.30729.01)安装了x86和x86-64编译器.两个编译器都正常运行; 我已经使用它们构建并测试了C和C++代码.我尝试从为32位和64位编译设置的命令shell运行nvcc,并使用-ccbin命令行选项将nvcc指向Visual C++安装目录.

处理此设置的正确方法是什么?有没有什么方法可以让nvcc对于发生的事情更加冗长?-v标志并没有太大的帮助.理想情况下,某种方式可以让它显示出发现的内容与预期发现的内容.如果我安装Visual C++ Express,这会更好吗?或者只是支持与CUDA一起使用的VC++的商业版本?

windows cuda nvcc visual-c++

2
推荐指数
1
解决办法
2万
查看次数

如何在Android中生成HMAC MD5?

我是这个领域的新手!我有这个Message和Key,我也想使用HMAC MD5来使用这两个,所以如果可能的话再举一些例子或示例代码.Gived链接显示了我想要的整体功能代码。请帮助我。

Messgae = POSTuserMon,2010年6月28日10:18:33GMT7FF4471B-13C0-5A9F-BB7B-7309F1AB7F08

键= d6fc3a4a06ed55d24fecde188aaa9161

链接= http://hash.online-convert.com/md5-generator

android cryptography

2
推荐指数
1
解决办法
6332
查看次数