2009-10-22 86 views
2

我想在Linux上試用谷歌的tcmalloc ...我在這裏有一個巨大的項目,有數百個qmake生成的Makefile的...我想找到一種方法讓gcc全局鏈接到tcmalloc(如它使用libc)...這可能嗎?或者我將不得不編輯每個Makefile?全球使用Google的malloc?

(我不想因爲有數百人編輯所有的親文件)

(另外,我們已經嘗試了LD_PRELOAD方法,它不工作完全正確)...

+0

難道你不能只編輯qmake的.pro文件嗎? – liori 2009-10-22 21:54:56

+1

您可以提供更多有關LD_PRELOAD無法正常工作的信息嗎?當你嘗試使用LD_PRELOAD時,你到底遇到了什麼? – 2009-10-22 22:04:34

+1

好吧,它看起來應用程序的一部分是使用tcmalloc ...它的分配的廣泛範圍不會tcmalloc ...我試圖用ltrace來驗證這一點,但ltrace相當快地崩潰(順便說一句,ltrace只顯示調用到qt中,並且tcmalloc也只生成了一個顯示qt代碼的報告...但是,更多的東西在這個應用程序中調用malloc ...) – dicroce 2009-10-22 22:06:42

回答

4

你的makefiles如何訪問編譯器(gcc/g ++/cc/C++)?

如果只是按名稱(G ++),而不是通過顯式路徑(在/ usr/bin中/ G ++),你可以簡單地創建一個替代G ++在你喜歡的任何目錄,並前置一個目錄添加到您路徑。

如:創建  〜/ mytmpgccdir/G ++  文件:

#!/bin/tcsh -f 
exec /usr/bin/g++ -Lfoo -lfoo $*:q 

添加任何額外(-lfoo -lfoo)你喜歡的,之前或其他參數後($ *:q)。

然後預先將它放到您的路徑並正常製作。

#tcsh version 
% set path = (~/mytmpgccdir/ $path:q) 
% make clean 
% make 

p.s.如果是明確的名稱,您可以在命令行上覆蓋它。喜歡的東西:  讓所有GCC =〜/ mytmpgccdir/GCC

p.p.s如果你使用LD_PRELOAD,你可能想這樣一個腳本來運行程序之前SETENV LD_PRELOAD。否則,很容易在每個命令(如/ bin/ls,make,g ++等)上結束LD_PRELOAD'ing。

+0

太棒了!我會給這一槍! – dicroce 2009-10-23 13:56:31

+0

http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ – 2011-05-12 12:30:42

2

首先,檢查qmake文檔。有一個簡單的方法來指定(在.pro文件),某圖書館應始終被鏈接

而且,因爲你只是嘗試,只需使用LD_PRELOAD - 無需重新編譯:

LD_PRELOAD="/usr/lib/foo/libtcmalloc.so" ./your_program

您不必將「your_program」鏈接到谷歌的tcmalloc庫。