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

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>
            久久精品女人| 国产女人精品视频| 久久免费视频观看| 欧美三级免费| 亚洲国产日韩精品| 国产亚洲欧洲997久久综合| 亚洲精品中文在线| 亚洲二区视频在线| 久久久久高清| 久久九九免费视频| 国产精品久久久久久久午夜片| 亚洲国产精品电影| 亚洲国产精品久久久久秋霞影院 | 妖精成人www高清在线观看| 久久久国产午夜精品| 久久精品视频99| 国产精品爽黄69| 亚洲小视频在线观看| 亚洲一区二区三区在线观看视频| 欧美成人一二三| 亚洲国产精品一区二区第四页av| 在线观看亚洲精品视频| 久久亚洲欧美国产精品乐播| 久久视频一区二区| 黄色av成人| 久久国内精品视频| 久久一区视频| 亚洲激情第一区| 欧美激情国产精品| 亚洲老板91色精品久久| 亚洲天堂久久| 国产精品乱码久久久久久| 亚洲图片在区色| 久久高清免费观看| 国产伪娘ts一区| 久久久久久久久岛国免费| 欧美r片在线| 日韩视频在线观看| 国产精品福利久久久| 亚洲欧美综合一区| 久久婷婷综合激情| 亚洲黄色大片| 欧美日韩中文在线观看| 亚洲欧美日产图| 久久综合网络一区二区| 91久久在线| 欧美色区777第一页| 先锋影音久久久| 免费在线观看精品| 99国内精品久久久久久久软件| 欧美片网站免费| 亚洲午夜女主播在线直播| 久久精品欧美日韩| 亚洲美女视频在线免费观看| 国产精品男gay被猛男狂揉视频| 午夜性色一区二区三区免费视频| 免播放器亚洲| 亚洲综合不卡| 在线看日韩欧美| 欧美日韩一区自拍| 久久aⅴ国产紧身牛仔裤| 亚洲国产日韩欧美在线动漫| 午夜精品偷拍| 在线精品亚洲一区二区| 欧美午夜精品伦理| 裸体丰满少妇做受久久99精品| 日韩视频一区二区三区| 久久一区中文字幕| 亚洲欧美日韩在线观看a三区| 在线日韩中文字幕| 国产精品久久久久久久久久久久久久 | 欧美午夜精品一区二区三区| 久久精品国语| 中文日韩在线| 亚洲欧洲在线一区| 久久久五月天| 亚洲综合首页| 亚洲精品乱码久久久久久按摩观| 国产精品chinese| 蜜臀av性久久久久蜜臀aⅴ| 亚洲欧美日韩国产一区| 亚洲国产清纯| 老牛嫩草一区二区三区日本| 亚洲一区日韩在线| 亚洲激情成人在线| 黄色日韩精品| 国产欧美在线播放| 国产精品家庭影院| 欧美日韩大陆在线| 欧美国产日韩一区二区| 久久综合给合| 久久精品国产综合精品| 性欧美激情精品| 亚洲午夜黄色| 亚洲视频一二三| 亚洲精品少妇| 亚洲人成网站在线观看播放| 欧美成黄导航| 欧美粗暴jizz性欧美20| 麻豆av一区二区三区久久| 欧美影院久久久| 欧美综合国产| 久久精品国产免费观看| 久久国产精品99精品国产| 欧美一区二区日韩| 久久成人免费| 久久成人av少妇免费| 久久国产精品高清| 久久久久久综合| 久久综合一区二区三区| 老司机免费视频一区二区三区| 久久噜噜亚洲综合| 欧美88av| 91久久黄色| 91久久久在线| 99精品免费视频| 亚洲午夜精品网| 香蕉久久夜色| 久久中文欧美| 欧美本精品男人aⅴ天堂| 欧美成人免费全部| 欧美日韩日本网| 国产精品家庭影院| 国产视频在线观看一区二区三区 | 一区二区欧美日韩| 亚洲午夜极品| 久久精品网址| 欧美国产一区二区在线观看 | 免费欧美日韩| 欧美日韩国产一区二区三区| 欧美视频在线观看视频极品| 国产精品亚洲人在线观看| 一区二区三区在线观看欧美| 亚洲免费av片| 欧美亚洲免费高清在线观看| 久久九九全国免费精品观看| 欧美电影美腿模特1979在线看| 欧美激情欧美激情在线五月| 亚洲精品社区| 欧美在线网站| 欧美久久在线| 国产一区二区成人| 99精品99久久久久久宅男| 欧美一区二区三区免费看| 欧美多人爱爱视频网站| 亚洲视频一区在线观看| 每日更新成人在线视频| 国产精品进线69影院| 激情欧美一区二区三区| 一区二区三区四区五区在线| 久久久久久综合| 日韩视频二区| 开心色5月久久精品| 国产麻豆视频精品| 一本久久综合亚洲鲁鲁五月天| 久久精品91| 夜夜夜久久久| 欧美阿v一级看视频| 国产女人精品视频| 亚洲最黄网站| 蜜桃视频一区| 午夜精品久久久久久久99黑人 | 免费高清在线视频一区·| 国产精品久久久久久久电影 | 亚洲第一视频| 欧美一乱一性一交一视频| 亚洲娇小video精品| 久久久91精品国产| 国产精品亚洲欧美| 一区二区三区四区五区视频| 欧美承认网站| 久久精品国产第一区二区三区最新章节| 欧美日韩另类视频| 亚洲欧洲另类国产综合| 久久综合色播五月| 香蕉乱码成人久久天堂爱免费| 国产精品www994| 一本大道久久a久久精品综合| 猛干欧美女孩| 久久久久久黄| 在线不卡免费欧美| 久久久亚洲国产天美传媒修理工| 亚洲资源在线观看| 国产精品久久一级| 亚洲一区日韩| 亚洲婷婷免费| 国产精品普通话对白| 亚洲男同1069视频| 亚洲私拍自拍| 欧美午夜精品伦理| 亚洲一区二区少妇| 一区二区日韩伦理片| 欧美日韩一视频区二区| 一区二区日韩精品| 夜夜嗨av一区二区三区网站四季av | 一区二区三区日韩精品视频| 亚洲国产精品电影在线观看| 另类亚洲自拍| 99国产精品国产精品久久 | 欧美中文字幕在线观看|