青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁 新隨筆 聯系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

#

int *p = new int[10]; delete [] p; 既然 delete 時無需提供數組大小,那么顯然編譯器是知道數組的大小(或者說界限的)。 那么 編譯器是如何知道數組大小的?(比如維護了一張表、按特定格式存儲……) 既然知道數組大小,編譯器能否自動檢查數組越界的情況?不檢查是否是為了性能? 編程時如何利用這份信息? 另外,不借助搜索引擎如何解答這個問題,有類似文檔之類的東西可以參考嗎?修改 1:拿msvc來說,在new/malloc返回的ptr前n個字節里保存了大小,msvc還可以用_msize()來獲得size,具體保存在哪可以調試看看; 2:編譯器未必知道,有些size是運行時決定的.真正記錄大小是在運行時,而不是編譯期.數組越界不能自動檢查,ptr + offset,這種方式程序無法知道程序員的本意要訪問的到底是不是數組那塊內存 3:特定環境下可能有用啊.(例:一個妹子問我在vs里怎么通過一個new出來的指針獲得size,然后就可以利用這些信息換妹子崇拜的眼神) PS:上調試器. 作者:吉林小伙 鏈接:https://www.zhihu.com/question/27112272/answer/35301722 來源:知乎 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 1:new的時候已經多new了點空間把長度寫進去了 2:不能檢查,因為不是所有的指針都是new出來,誰知道到底指向的是什么 3:根據C++標準的話,沒辦法利用 4:反正VC++已經98%以上跟標準完全一致了,而且gcc跟clang的私貨也不比VC++少,你去msdn看C++語法手冊就好了 C++ Language Reference,手冊只要你讀兩遍,你就什么都明白了。我初三就是讀了兩遍VC++5.0時代的msdn的語法手冊學會C++的。當然要熟悉還是要靠練習,光讀的話就算都記住了,也只能一知半解。 作者:vczh 鏈接:https://www.zhihu.com/question/27112272/answer/35291952 來源:知乎 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
posted @ 2016-03-22 10:21 Enic 閱讀(417) | 評論 (0)編輯 收藏

首先Ref不用解釋。
cocos和常見的Ref或者智能指針稍微有點不一樣:
首先介紹傳統玩法:
傳統玩法Ref一般要配合RefPtr使用的,也就是new出來的Ref派生類引用計數為0,要放到一個RefPtr里邊來做生命周期管理。

在來看看cocos的玩法:
new出來Ref引用計數是為1的,那么問題來了,這樣如果Add和Release成對出現則Ref永遠回不到0了。
cocos是這樣解決這個問題的:autorelease
調用autorelease,會把當前Ref為1的對象壓入pool,然后在下一幀的調用release這樣就天下太平了,如果有add到其他節點上他就會變1,如果沒有就直接歸零析構了
這樣就省掉了RefPtr操作


為了保持風格統一,我也必須這樣玩,這樣的優勢是不需要RefPtr,可能腳本綁定會方便不少吧
posted @ 2016-03-15 20:52 Enic 閱讀(324) | 評論 (0)編輯 收藏

WebSocket is an underlying network protocol that enables you to build other standard
protocols on top of it.

The WebSocket Protocol enables full duplex communication between a client and
a remote server over the Web, and supports transmission of binary data and text strings.
The protocol consists of an opening handshake followed by basic message framing, and is
layered over TCP.


WebSocket programming follows an asynchronous programming model, which
means that as long as a WebSocket connection is open, your application simply listens
for events. Your client does not need to actively poll the server for more information. To
start listening for the events, you simply add callback functions to the WebSocket object.
Alternatively, you can use the addEventListener() DOM method to add event listeners
to your WebSocket objects.
A WebSocket object dispatches four different events:
· Open
· Message
· Error
· Close
As with all web APIs, you can listen for these events using on<eventname> handler
properties, as well as using the addEventListener(); method.

ws.onopen
ws.onmessage
ws.onerror
ws.onclose

e.data instanceof Blob
ws.binaryType = "blob"

WebSocket objects have two methods: send() and close()


Listing 2-12. Waiting for the Open Event Before Sending a Message
// Wait until the open event before calling send().
var ws = new WebSocket("ws://echo.websocket.org")
ws.onopen = function(e) {
ws.send("Initial data");
}

Listing 2-13. Checking the readyState Property for an Open WebSocket
// Handle outgoing data. Send on a WebSocket if that socket is open.
function myEventHandler(data) {
if (ws.readyState === WebSocket.OPEN) {
// The socket is open, so it is ok to send the data.
ws.send(data);
} else {
// Do something else in this case.
//Possibly ignore the data or enqueue it.
}
}


// Send a Blob
var blob = new Blob("blob contents");
ws.send(blob);
// Send an ArrayBuffer
var a = new Uint8Array([8,6,7,5,3,0,9]);
ws.send(a.buffer);


Listing 2-15. Calling the close() Method
// Close the WebSocket connection
ws.close();
You can optionally pass two arguments to the close() method: code (a numerical
status code) and reason (a text string). Passing these arguments transmits information
to the server about why the client closed the connection. We will discuss the status
codes and reasons in greater detail in Chapter 3, when we cover the WebSocket closing
handshake. Listing 2-16 shows an example of calling the close() method with an
argument.
Listing 2-16. Calling the close() Method with a Reason
// Close the WebSocket connection because the session has ended successfully
ws.close(1000, "Closing normally");
Listing 2-16 uses code 1000, which means, as it states in the code, that the
connection is closing normally.


WebSocket Object Attributes
There are several WebSocket Object attributes you can use to provide more information
about the WebSocket object: readyState, bufferedAmount, and protocol.

Table 2-1. readyState Attributes, Values, and Status Descriptions
Attribute Constant     Value     Status
WebSocket.CONNECTING   0   The connection is in progress but has not been established.
WebSocket.OPEN   1   The connection has been established. Messages can flow between the client and server.
WebSocket.CLOSING   2   The connection is going through the closing handshake.
WebSocket.CLOSED   3   The connection has been closed or could not be opened.

WebSocket Object Attribute: protocol
The protocol attribute is the empty string before the
opening handshake completes and remains an empty string if the server does not choose
one of the protocols offered by the client.

 

posted @ 2016-02-22 17:02 Enic 閱讀(298) | 評論 (0)編輯 收藏

GDI+使用雙緩沖繪圖
————————————————————————
我再來詳細解釋一下剛才實現雙緩沖的具體步驟:
1、在內存中建立一塊“虛擬畫布”:
Bitmap bmp = new Bitmap(600, 600);
2、獲取這塊內存畫布的Graphics引用:
Graphics g = Graphics.FromImage(bmp);
3、在這塊內存畫布上繪圖:
g.FillEllipse(brush, i * 10, j * 10, 10, 10);
4、將內存畫布畫到窗口中
this.CreateGraphics().DrawImage(bmp, 0, 0);
====================
maybe better
CDC dcMemory;
dcMemory.CreateCompatibleDC(&dc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc,1024,768);
dcMemory.SelectObject(&bmp);
   
Graphics _Graphics(dcMemory.m_hDC);
_Graphics.DrawImage(_pImage,0,0,1024,768);
//這是在GDI+中的寫法。
   
dc.BitBlt(0,0,1024,768,&dcMemory,0,0,SRCCOPY);
   
_Graphics.ReleaseHDC(dcMemory.m_hDC);
dcMemory.DeleteDC();
bmp.DeleteObject(); 



-------------------------------------------------------------------------
補充:
1.對于GDI常見的做法都是MemDC一下不解釋了
2.GDI+似乎也可以用MemDC生成一個graphics,然后畫好了,在把MemDC bit到WndDC上,但是會有各種各樣的問題。
3.不管是那種方式,都是一個宗旨:直接操作前臺屏幕上的DC在繪圖的過程中會顯得比較慢,所以生成一個內存畫布,把所有的貼圖操作都在不可見的內存畫布上操作完成,然后一次性貼圖到前臺DC上。這樣實際上還多了一次貼圖,但是對于前臺DC的操作已經是無限小了。
4.GDI+還有一種更優的方式:創建一個內存bitmap,然后從內存bitmap創建出GDI+位圖,然后使用做個位圖作為渲染畫布。渲染完成后,在直接把bitmap貼圖到前臺DC上面來,內存中的bitmap是復用的,不用在每個渲染事件中重新創建。
5.為了更好的GL或者其他的渲染接口融合,基于bitmap的內存畫布應該是最優的做法。




posted @ 2015-11-12 14:28 Enic 閱讀(433) | 評論 (0)編輯 收藏

數據庫備份實例/** 
**數據庫備份實例 
**朱二 2004年5月 
**備份策略: 
**數據庫名:test 
**備份文件的路徑e:\backup 
**每個星期天凌晨1點做一次完全備份,為保險起見,備份到兩個同樣的完全備份文件test_full_A.bak和test_full_B.bak 
**每天1點(除了星期天)做一次差異備份,分別備份到兩個文件test_df_A.bak和test_df_B.bak(采用附加到原備份的方式) 
**每一個小時做一次事務日志備份,分別備份到兩個文件test_log_A.bak和test_log_B.bak(采用附加到原備份的方式) 
**/ 


--第一 完全備份部分 
--新增作業 
EXEC sp_add_job @job_name = '完全備份' 
--新增作業步驟1,把數據庫備份到test_full_backup_A.bak 
EXEC sp_add_jobstep @job_name = '完全備份', 
@step_name = 'Setp1', 
@subsystem = 'TSQL', 
@command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_full_A.bak'' WITH INIT', 
@on_fail_action=3, --失敗后轉到下一步 
@on_success_action=3,-- 成功后轉到下一步 
@retry_attempts = 5, 
@retry_interval = 5 

--新增作業步驟2,把數據庫備份到test_full_B.bak 
EXEC sp_add_jobstep @job_name = '完全備份', 
@step_name = 'Setp2', 
@subsystem = 'TSQL', 
@command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_full_B.bak'' WITH INIT', 
@retry_attempts = 5, 
@retry_interval = 5 

--調度 
EXEC sp_add_jobschedule @job_name = '完全備份', 
@name = 'Schedule_1', 
@freq_type = 8, -- 按周 
@freq_interval = 1, --每星期天執行 
@freq_recurrence_factor=1, 
@active_start_time = 10000 --開始時間: 凌晨1點 
--第二 差異備份部分 
--新增作業 
EXEC sp_add_job @job_name = '差異備份' 
--新增作業步驟1,把數據庫備份到test_df_A.bak 
EXEC sp_add_jobstep @job_name = '差異備份', 
@step_name = 'Setp1', 
@subsystem = 'TSQL', 
@command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_df_A.bak'' WITH DIFFERENTIAL', 
@on_fail_action=3, --失敗后轉到下一步 
@on_success_action=3,-- 成功后轉到下一步 
@retry_attempts = 5, 
@retry_interval = 5 

--新增作業步驟2,把數據庫備份到test_df_B.bak 
EXEC sp_add_jobstep @job_name = '差異備份', 
@step_name = 'Setp2', 
@subsystem = 'TSQL', 
@command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_df_B.bak'' WITH DIFFERENTIAL', 
@retry_attempts = 5, 
@retry_interval = 5 

--調度 
EXEC sp_add_jobschedule @job_name = '差異備份', 
@name = 'Schedule_1', 
@freq_type = 8, -- 按周 
@freq_interval = 126, --星期一至星期六 
@freq_recurrence_factor=1, 
@active_start_time = 10000 --開始時間: 凌晨1點 


--第二 事務備份部分 
--新增作業 
EXEC sp_add_job @job_name = '事務備份' 
--新增作業步驟1,把數據庫備份到test_log_A.bak 
EXEC sp_add_jobstep @job_name = '事務備份', 
@step_name = 'Setp1', 
@subsystem = 'TSQL', 
@command = 'BACKUP LOG Test TO DISK=''e:\backup\test_log_A.bak''', 
@on_fail_action=3, --失敗后轉到下一步 
@on_success_action=3,-- 成功后轉到下一步 
@retry_attempts = 5, 
@retry_interval = 5 

--新增作業步驟2,把數據庫備份到test_log_B.bak 
EXEC sp_add_jobstep @job_name = '事務備份', 
@step_name = 'Setp2', 
@subsystem = 'TSQL', 
@command = 'BACKUP LOG Test TO DISK=''e:\backup\test_log_B.bak''', 
@retry_attempts = 5, 
@retry_interval = 5 

--調度 
EXEC sp_add_jobschedule @job_name = '事務備份', 
@name = 'Schedule_1', 
@freq_type = 4, -- 按天 
@freq_interval=1,--每一天 
@freq_subday_type=8, --按小時 
@freq_subday_interval=1 --每一個小時 
posted @ 2015-09-06 09:33 Enic 閱讀(204) | 評論 (0)編輯 收藏

bpack=string.pack
bunpack=string.unpack
-- 輸出二進制
function hex(s)
 s=string.gsub(s,"(.)",function (x) return string.format("%02X",string.byte(x)) end)
 return s
end
--解包傳入的是hex和FMT(><大小端),輸出是FMT指定的類型:i int, n lua_num
--i=12345 f="i"
--a=bpack(f,i,i,i)
--print(hex(a))
--print(bunpack(a,f))
--打包輸入fmt,實際類型,輸出hex
local n = 0x12345678
--tb = {}
--dump(tb)
--tb = n
--dump(tb)
a = bpack('>n', n)
dump(hex(a))
posted @ 2015-09-01 18:30 Enic 閱讀(343) | 評論 (0)編輯 收藏

--如何定義枚舉
--下面的函數實現:
--轉換 EnumTable = {1:Enum1, 2:Enum2}
--到   EnumTable = {Enum1:1, Enum2:2}
function CreateEnumTable(tb, indexStart)
    --assert(IsTable(tb))
    local enumTB = {}
    local enumIndex = indexStart or 0
    
    --轉換字符table到枚舉table
    for index, value ipairs(tb) do
        enumTB[v] = enumIndex + index
    end
    return enumTB
end
--只是返回值而已和C不一樣
assert(0)
--用這個和字符串比較實現判斷變量類型
print(type(CreateEnumTable))
--xpcall可以保護執行一個函數,通過返回值確定異常情況
posted @ 2015-09-01 17:29 Enic 閱讀(913) | 評論 (0)編輯 收藏

VC++ Runtime Error 異常捕獲之不掛的程序

 很多軟件通過設置自己的異常捕獲函數,捕獲未處理的異常,生成報告或者日志(例如生成mini-dump文件),達到Release版本下追蹤Bug的目的。但是,到了VS2005(即VC8),Microsoft對CRT(C運行時庫)的一些與安全相關的代碼做了些改動,典型的,例如增加了對緩沖溢出的檢查。新CRT版本在出現錯誤時強制把異常拋給默認的調試器(如果沒有配置的話,默認是Dr.Watson),而不再通知應用程序設置的異常捕獲函數,這種行為主要在以下三種情況出現。

(1)       調用abort函數,并且設置了_CALL_REPORTFAULT選項(這個選項在Release版本是默認設置的)。

(2)       啟用了運行時安全檢查選項,并且在軟件運行時檢查出安全性錯誤,例如出現緩存溢出。(安全檢查選項/GS 默認也是打開的)

(3)       遇到_invalid_parameter錯誤,而應用程序又沒有主動調用

_set_invalid_parameter_handler設置錯誤捕獲函數。

所以結論是,使用VS2005(VC8)編譯的程序,許多錯誤都不能在SetUnhandledExceptionFilter捕獲到。這是CRT相對于前面版本的一個比較大的改變,但是很遺憾,Microsoft卻沒有在相應的文檔明確指出。

解決方法

       之所以應用程序捕獲不到那些異常,原因是因為新版本的CRT實現在異常處理中強制刪除所有應用程序先前設置的捕獲函數,如下所示:

 /* Make sure any filter already in place is deleted. */

 SetUnhandledExceptionFilter(NULL);

 UnhandledExceptionFilter(&ExceptionPointers);

解決方法是攔截CRT調用SetUnhandledExceptionFilter函數,使之無效。在X86平臺下,可以使用以下代碼。

#ifndef _M_IX86

       #error "The following code only works for x86!"

#endif

 

void DisableSetUnhandledExceptionFilter()

{

    void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),

                                                         "SetUnhandledExceptionFilter");

    if (addr)

    {

              unsigned char code[16];

              int size = 0;

              code[size++] = 0x33;

              code[size++] = 0xC0;

              code[size++] = 0xC2;

              code[size++] = 0x04;

              code[size++] = 0x00;

 

               DWORD dwOldFlag, dwTempFlag;

              VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);

              WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);

              VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);

       }

}

在設置自己的異常處理函數后,調用DisableSetUnhandledExceptionFilter禁止CRT設置即可。

其它討論

       上面通過設置api hook,解決了在VS2005上的異常捕獲問題,這種雖然不是那么“干凈”的解決方案,確是目前唯一簡單有效的方式。

       雖然也可以通過_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT), signal(SIGABRT, ...), 和_set_invalid_parameter_handler(...) 解決(1)(3),但是對于(2),設置api hook是唯一的方式。

注:對于錯誤是否顯示錯誤提示框,可以使用SetErrorMode()


后面又遇到WIN8.1上
VirtualProtect報錯C0000005,最后還是想辦法解決了

bool AdjustPrivileges() 
{     
    HANDLE hToken;     
    TOKEN_PRIVILEGES tp;     
    TOKEN_PRIVILEGES oldtp;     
    DWORD dwSize=sizeof(TOKEN_PRIVILEGES);     
    LUID luid;       
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    {         
        if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;         
        else return false;     
    }     

    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) 
    {        
        CloseHandle(hToken);         
        return false;     
    }     
    
    ZeroMemory(&tp, sizeof(tp));     
    tp.PrivilegeCount=1;     
    tp.Privileges[0].Luid=luid;     
    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;     
    /* Adjust Token Privileges */    
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) 
    {        
        CloseHandle(hToken);         
        return false;     
    }     
    
    // close handles     
    CloseHandle(hToken);     
    return true



void DisableSetUnhandledExceptionFilter()

{

    void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),

        "SetUnhandledExceptionFilter");

    if (addr)

    {

        unsigned char code[16];

        int size = 0;

        code[size++] = 0x33;

        code[size++] = 0xC0;

        code[size++] = 0xC2;

        code[size++] = 0x04;

        code[size++] = 0x00;

        //SetProcessDEPPolicy(1);

        DWORD dwOldFlag, dwTempFlag;

        // win8.1下用百度找了下PAGE_READWRITE崩潰,實際測試提升debug權限,SetProcessDEPPolicy(1);都無效,改成PAGE_EXECUTE_READWRITE生效
        
//VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
        VirtualProtect(addr, size, PAGE_EXECUTE_READWRITE, &dwOldFlag);
        WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);

        VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);

    }

}



posted @ 2015-08-28 11:14 Enic 閱讀(729) | 評論 (0)編輯 收藏

在下面的章節中, 你將會學到如何用 Apache, Tomcat 和微軟的 IIS 創建 MIME 類型.

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">用 Apache 創建 MIME 類型

在 Apache 里, MIME 類型和文件擴展名之間的映射是被存放在配置文件 "apache根目錄/conf/mime.types" 里的 (對于大多數 LINUX 系統, 是放在 /etc/apache2/mods-available 里的), 這里的 "apache根目錄" 是 Apache 在你的服務器上的安裝路徑.

要創建 MIME 類型, 打開 mime.types 文件. 以 # 字符開頭的行是注釋行, Apache 會忽略它們. 其它每行都以某種 MIME 類型開頭, 然后跟著一種或多種文件擴展名. 其形式如下:

mime類型 文件擴展名1 文件擴展名2 文件擴展名3 ... 

下面是一些例子:

text/html html htm application/vnd.wap.xhtml+xml xhtml text/vnd.wap.wml wml text/vnd.wap.wmlscript wmls image/vnd.wap.wbmp wbmp 

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">用 Tomcat 創建 MIME 類型

在 Tomcat 5.x 和 4.x 里, MIME 類型和文件擴展名之間的缺省映射是被存放在文件 tomcat根目錄/conf/web.xml 里的, 這里的 "tomcat根目錄" 是 Tomcat 在你的服務器上的安裝目錄. 該文件里所指定的映射會被應用到你的 Tomcat 服務器所運行的所有 Web/WAP 應用程序上. 針對應用程序的映射應該 Web/WAP 應用的目錄里的 WEB-INF/web.xml 文件里設置.

每種映射都要用 <mime-mapping>, <extension> 和 <mime-type> 標簽來指定. 下面就是一個例子:

<web-app> ...    <mime-mapping>     <extension>xhtml</extension>     <mime-type>application/vnd.wap.xhtml+xml</mime-type>   </mime-mapping>    <mime-mapping>     <extension>wml</extension>     <mime-type>text/vnd.wap.wml</mime-type>   </mime-mapping>    <mime-mapping>     <extension>wmls</extension>     <mime-type>text/vnd.wap.wmlscript</mime-type>   </mime-mapping>    <mime-mapping>     <extension>wbmp</extension>     <mime-type>image/vnd.wap.wbmp</mime-type>   </mime-mapping>  ... </web-app> 

" src="/CuteSoft_Client/CuteEditor/Images/anchor.gif">用微軟的 IIS 創建 MIME 類型

微軟的 IIS 提供了一個創建 MIME 類型的圖形界面. 下面列出了在 Windows Server 2003 上用 IIS 6.0 創建 MIME 類型步驟:

   1. 打開 IIS 窗口: 選擇 控制面板 -> 管理工具 -> Internet 服務管理器.
   2. 在左手邊的樹狀結構中, 你應當可以看到其中有一項標題為你的計算機的名字. 在其上點右鍵, 會彈出一個菜單.
   3. 點擊菜單中的屬性, 打開屬性窗口.
   4. 點擊 "HTTP 頭" 選項卡, 下面有 "MIME 映射", 點擊 "文件類型" 按紐.
   5. 在 "文件類型" 窗口中, 你可以看到一個 MIME 映射的列表. 用標有 "新類型...", "刪除" 和 "編輯..."  的按紐作你想要的修改.

在其它版本的 IIS 中創建 MIME 類型應該與此類似.

posted @ 2015-08-21 16:25 Enic 閱讀(151) | 評論 (0)編輯 收藏

使用CMake GCC和Clang的/ LLVM之間切換

cmake llvm clang
我公司擁有一批項目的CMake的,我希望能夠方便地切換GCC或鐺/ LLVM他們。我相信(請如果我錯了!)表示鏘我需要進行如下設置:
 SET (CMAKE_C_COMPILER    "/usr/bin/clang")  SET (CMAKE_C_FLAGS    "-Wall -std=c99")  SET (CMAKE_C_FLAGS_DEBUG   "-g")  SET (CMAKE_C_FLAGS_MINSIZEREL  "-Os -DNDEBUG")  SET (CMAKE_C_FLAGS_RELEASE  "-O4 -DNDEBUG")  SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")  SET (CMAKE_CXX_COMPILER    "/usr/bin/clang++")  SET (CMAKE_CXX_FLAGS    "-Wall")  SET (CMAKE_CXX_FLAGS_DEBUG   "-g")  SET (CMAKE_CXX_FLAGS_MINSIZEREL  "-Os -DNDEBUG")  SET (CMAKE_CXX_FLAGS_RELEASE  "-O4 -DNDEBUG")  SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")  SET (CMAKE_AR  "/usr/bin/llvm-ar")  SET (CMAKE_LINKER "/usr/bin/llvm-ld")  SET (CMAKE_NM  "/usr/bin/llvm-nm")  SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")  SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib") 
是否有這些和默認的GCC變量之間的切換,最好是全系統的變化,而不是具體的項目(即不只是將它們添加到項目的的CMakeLists.txt)一個簡單的方法? 另外,是否有必要的llvm-*節目鐺的gcc時代替,而不是系統默認值?有什么區別?
本文地址 :CodeGo.net/340772/ 
------------------------------------------------------------------------------------------------------------------------- 
1. CMake的榮譽的變量CCCXX在檢測到C和C ++編譯器
$ export CC=/usr/bin/clang $ export CXX=/usr/bin/clang++ $ cmake .. -- The C compiler identification is Clang -- The CXX compiler identification is Clang 
具體標志可以通過將它們放入一個系統范圍的CMake文件并指向CMAKE_USER_MAKE_RULES_OVERRIDE變量,它被覆蓋。創建一個文件~/ClangOverrides.txt其內容如下:
SET (CMAKE_C_FLAGS_INIT    "-Wall -std=c99") SET (CMAKE_C_FLAGS_DEBUG_INIT   "-g") SET (CMAKE_C_FLAGS_MINSIZEREL_INIT  "-Os -DNDEBUG") SET (CMAKE_C_FLAGS_RELEASE_INIT  "-O4 -DNDEBUG") SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") SET (CMAKE_CXX_FLAGS_INIT    "-Wall") SET (CMAKE_CXX_FLAGS_DEBUG_INIT   "-g") SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT  "-Os -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELEASE_INIT  "-O4 -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") 
后綴_init會讓CMake的初始化相應的*_FLAGS變量與給定的值。然后調用cmake的以下面的方式:
$ cmake -DCMAKE_USER_MAKE_RULES_OVERRIDE=~/ClangOverrides.txt .. 
終于到了LLVM的binutils力,設置內部變量_CMAKE_TOOLCHAIN_PREFIX。這個變量是由榮幸CMakeFindBinUtils模塊:
$ cmake -D_CMAKE_TOOLCHAIN_PREFIX=llvm- .. 
把這個放在一起你可以寫一個shell包裝它設置了變量CCCXX然后調用cmake的可變覆蓋。 
2. 全系統的C ++的變化對Ubuntu的: sudo用update-alternatives-配置C ++ 將打印是這樣的:
 Selection Path    Priority Status ------------------------------------------------------------ * 0   /usr/bin/g++  20  auto mode  1   /usr/bin/clang++ 10  manual mode  2   /usr/bin/g++  20  manual mode 
然后,只需選擇鐺++。 
3. 你的
option(USE_CLANG "build application with clang" OFF) # OFF is the default 
然后在包裹如果()S中的設置:
if(USE_CLANG)  SET (...)  .... endif(USE_CLANG) 
這樣,它會顯示為在GUI配置工具的cmake的選項。 為了讓您在整個系統可以在變量的默認值或保持與答案。 
4. 你絕對不需要不同的LLVM-AR等程序:
SET (CMAKE_AR  "/usr/bin/llvm-ar") SET (CMAKE_LINKER "/usr/bin/llvm-ld") SET (CMAKE_NM  "/usr/bin/llvm-nm") SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump") SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib") 
這些都是為了工作,對LLVM內部格式,因此阿仁'到您的應用程序的生成。 作為一個說明 CodeGo.net,O4將在你的程序調用的LTO,你可能不希望(這樣會大大)和鐺默認為C99模式,使標志不是必需的兩種。 
5. 你的語法:$ENV{environment-variable}在你的CMakeLists.txt訪問變量。你可以適當地創建一個初始化的變量集的腳本,只是在引用這些變量的CMakeLists.txt文件。
posted @ 2015-08-20 11:52 Enic 閱讀(1455) | 評論 (0)編輯 收藏

僅列出標題
共22頁: 1 2 3 4 5 6 7 8 9 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久尹人网香蕉| 久久视频国产精品免费视频在线| 欧美精品麻豆| 99www免费人成精品| 午夜精品久久久久久| 国产综合色在线| 猛干欧美女孩| 夜夜狂射影院欧美极品| 欧美亚洲一区在线| 在线日韩成人| 欧美性猛交xxxx乱大交退制版| 亚洲尤物视频网| 男同欧美伦乱| 亚洲一区二区三区高清| 国模 一区 二区 三区| 欧美国产精品一区| 午夜久久久久久| 亚洲国产日韩精品| 欧美伊人久久久久久午夜久久久久| 极品少妇一区二区三区精品视频| 欧美伦理影院| 欧美在线视频观看免费网站| 亚洲国产精品嫩草影院| 久久av二区| 一区二区三区高清| 亚洲成色www8888| 国产精品久久久久免费a∨| 久久久久亚洲综合| 亚洲一区二区三区中文字幕在线| 欧美韩日精品| 久久久xxx| 亚洲在线一区二区三区| 最新成人av网站| 国产亚洲精品一区二区| 欧美日韩亚洲综合一区| 久久综合九色综合欧美狠狠| 亚洲香蕉视频| 亚洲精品欧洲| 欧美成人一区二区在线 | 欧美中文字幕不卡| 亚洲理论电影网| 极品尤物一区二区三区| 国产精品久久久99| 欧美第一黄色网| 久久久青草婷婷精品综合日韩| 亚洲午夜性刺激影院| 亚洲国产专区校园欧美| 麻豆精品视频在线观看| 欧美资源在线观看| 午夜伦理片一区| 亚洲一二三四区| 日韩午夜在线视频| 亚洲精品国精品久久99热| 狠狠入ady亚洲精品经典电影| 国产精品久久久久秋霞鲁丝| 欧美日韩国产在线一区| 欧美电影电视剧在线观看| 麻豆av一区二区三区久久| 欧美一区二区三区久久精品| 亚洲综合国产| 亚洲一卡二卡三卡四卡五卡| 亚洲深夜福利视频| 亚洲少妇自拍| 在线亚洲自拍| 亚洲伊人一本大道中文字幕| 中文国产一区| 亚洲综合日韩| 西西人体一区二区| 欧美一区二区三区的| 性色av一区二区三区红粉影视| 亚洲砖区区免费| 先锋影音一区二区三区| 午夜精品偷拍| 久久精品官网| 欧美成年网站| 欧美日韩直播| 国产精品一区二区在线观看网站| 国产精品视频午夜| 国产午夜精品麻豆| 在线播放国产一区中文字幕剧情欧美| 国内一区二区三区| 亚洲承认在线| 99视频精品全部免费在线| 国产精品99久久久久久有的能看| 亚洲视频一二| 久久精品一区二区三区四区| 久久综合激情| 亚洲人成网站精品片在线观看| 亚洲美女一区| 欧美一级淫片播放口| 久久婷婷影院| 欧美日韩第一区| 国产欧美一区二区色老头 | 亚洲激情社区| 夜夜嗨一区二区| 欧美在线视频不卡| 欧美a级片网| 国产精品日韩欧美| 亚洲第一网站| 亚洲欧美bt| 欧美刺激午夜性久久久久久久| 亚洲人成艺术| 欧美一区三区三区高中清蜜桃| 美女在线一区二区| 国产精品久久福利| 亚洲第一区在线| 亚洲综合视频一区| 麻豆91精品91久久久的内涵| 亚洲日本中文| 久久精品91| 欧美色大人视频| 欲香欲色天天天综合和网| 亚洲视频网在线直播| 久久综合婷婷| 中文一区二区| 免费一级欧美片在线播放| 国产精品毛片高清在线完整版| 亚洲国产91精品在线观看| 亚洲综合色自拍一区| 亚洲国产成人91精品| 午夜亚洲性色福利视频| 欧美国产精品va在线观看| 国产一区二区精品久久91| 夜夜夜久久久| 麻豆精品国产91久久久久久| 亚洲社区在线观看| 欧美激情亚洲综合一区| 狠狠做深爱婷婷久久综合一区| 亚洲曰本av电影| 亚洲国产精品www| 久久久久久久综合| 国产精一区二区三区| 这里只有精品视频在线| 欧美福利电影网| 久久大综合网| 国产欧美日韩伦理| 亚洲一区二区三| 亚洲精品裸体| 欧美激情网友自拍| 亚洲黄色免费电影| 噜噜噜久久亚洲精品国产品小说| 亚洲欧美第一页| 国产精品美女主播在线观看纯欲| 亚洲精品一区中文| 欧美黄色视屏| 久久综合狠狠| 亚洲第一色中文字幕| 美日韩精品视频| 久久青青草综合| 1204国产成人精品视频| 久久亚洲欧美| 久久精品人人做人人综合| 国产一区在线播放| 久久久亚洲国产美女国产盗摄| 亚洲欧美成人一区二区在线电影| 国产精品高潮呻吟久久av黑人| 一区二区三区.www| 日韩视频国产视频| 欧美日韩在线视频一区二区| 一区二区三区高清不卡| 亚洲精品偷拍| 欧美系列精品| 性欧美大战久久久久久久久| 亚洲午夜免费视频| 国产免费成人av| 久久免费视频这里只有精品| 久久久99久久精品女同性| 悠悠资源网亚洲青| 亚洲国产91精品在线观看| 欧美电影电视剧在线观看| 99精品欧美一区二区三区综合在线| 亚洲精品欧美专区| 国产精品美女久久久久久久| 欧美一区激情视频在线观看| 欧美一二区视频| 在线日韩av片| 亚洲精品偷拍| 国产欧美日韩精品a在线观看| 久久九九99| 免费国产一区二区| 亚洲神马久久| 欧美一二三区精品| 亚洲激情一区二区三区| 亚洲精品国产精品国产自| 国产精品青草久久久久福利99| 欧美中文字幕视频| 免费久久99精品国产自在现线| av不卡免费看| 欧美在线视频二区| 亚洲另类自拍| 亚洲在线一区| 亚洲高清中文字幕| 一区二区三区国产精华| 国语自产精品视频在线看8查询8| 欧美韩日一区二区| 国产精品久久久久久久久久三级| 久久综合国产精品台湾中文娱乐网| 欧美黄色影院| 久久精品一本| 欧美日韩精品在线|