存檔

‘c++’ 分類的存檔

nginx + fastcgi + c/c++

2016年7月18日 1 條評論

使用php寫后端程序的例子很多,用c/c++的比較少。

本文采用nginx,spawn,fastcgi++來構建一個基于cgi的web程序。
由于fastcgi++依賴于boost庫,我們先來裝boost庫

Linux下編譯boost

1.編譯前的準備工作

2.下載安裝包并解壓

編譯安裝

測試boost庫是否可以使用,boost編譯完成后運行程序報錯,

最開始以為是bzip2沒裝上,折騰了許久也沒搞定,最后我發現boost的官方文檔寫著gcc4.4.7,而我本地的編譯器是4.4.6,之后我把gcc升級到4.8重新編譯通過。

redhat6.3升級gcc4.8.0編譯安裝方法:

1.下載源碼并解壓

2.下載編譯所需的依賴項

3.建立編譯輸出目錄
mkdir gcc-build-4.8.0

4.進入此目錄,執行以下命令,生成makefile文件

5.執行以下命令進行編譯,編譯時間比較長

6.安裝
sudo make install

安裝完成后查看版本

重新執行boost的編譯,編寫一個例子測試是否成功

編譯運行

spawn-fcgi安裝

fastcgi安裝

啟動fastcgi程序

如果啟動報錯,可以加參數-n來看具體原因。

我的報錯如下,因為升級了gcc4.8,沒有升級libstdc++.so.6導致。

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found錯誤的解決

沒有3.4.15

連接到libstdc++.so.6新的庫

再次啟動fastcgi程序

程序會在前臺運行
檢查程序是否正常運行

配置nginx,增加

重新加載ngnx的配置

打開瀏覽器,訪問http://192.168.18.11/utf8-helloworld.fcgi,你會看到。
English: Hello World
Russian: Привет мир
Greek: Γεια σα? κ?σμο
Chinese: 世界您好
Japanese: 今日は世界
Runic English?: ???? ?????

參考
http://www.cnblogs.com/skynet/p/4173450.html
http://www.cnblogs.com/wanghetao/p/3934350.html
http://www.nongnu.org/fastcgipp/doc/2.1/index.html

分類: c++, nginx 標簽:

enumeration value not handled in switch

2016年5月17日 沒有評論

這是一個 warnning 錯誤,沒有處理switch中的枚舉值。

在switch中添加default 和 break; 可以解決這個問題。

分類: c++ 標簽:

mac下c++單元測試覆蓋率工具gcov

2016年5月1日 沒有評論

gcov 是 GNU 的代碼覆蓋率檢查工具。它利用編譯時的 -fprofile-arcs -ftest-coverage 和鏈接時的 -lgcov 選項參數生成 .gcno 文件進而通過這些文件統計覆蓋率。不過高版本的 mac 使用 clang 編譯器,不支持 -lgcov 選項生成 .gcno 文件。為了解決這個問題,我們可以使用-coverage參數來生成 .gcno 文件。例如:

我的g++ --version信息如下
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.4.0
Thread model: posix
使用-lgcov會報錯
ld: library not found for -lgcov

可以使用-coverage選項替換-lgcov

在C/C++中產生代碼覆蓋率的步驟包括如下幾步:
一、設置編譯參數
如下來設置Makefile中的編譯參數以使之支持覆蓋率產生:
ifeq ($(coverage), yes)
CXXFLAGS += -coverage
endif
這樣,可以使用 make coverage=yes 來引入這些編譯選項而不會影響到正常的編譯,比如:
#make coverage=yes
這時候會產生.gcno文件。

二、運行測試程序
#./exe
運行測試程序,會針對所有cpp源代碼產生相應的.gcda文件。

三、獲取覆蓋率數據
獲取覆蓋率數據的方法很多種,這里介紹兩種,分別產生txt和html數據:
1、使用gcov獲取文本形式的覆蓋率數據
使用gcc自帶的覆蓋率結果產生工具gcov能產生文本格式(.gcov)的覆蓋率結果。
#gcov xxx.cpp
2、使用lcov獲取html形式的覆蓋率數據
使用IBM的lcov來產生html結果數據,具體如下:
#lcov -c -d ./ -o app.info
#genhtml app.info -o cc_result

四、展示數據
將步驟三中產生的覆蓋率數據文件放到Apached的htdocs目錄下,就能通過瀏覽器來查看覆蓋率結果了。

五、基本術語
1、行覆蓋率(line coverage)
即源代碼有效行數與被執行的代碼行的比率。
2、分支覆蓋率(branch coverage)
即有判定語句的地方都會出現2個分支,整個程序經過的分支與所有分支的比率是分支覆蓋率。
3、增量覆蓋率(incremental coverage)
即被執行的新增和修改的代碼行數與新增和修改的代碼總行數的比率。

gcov實際例子,通過運行gtest中的sample1.cc單元測試。

makefile文件的寫法

編譯程序

編譯完成后直接執行gcov命令,會報未執行,需要先執行可執行文件

執行可執行文件

使用gcov查看sample1.cc文件的覆蓋率

表示:sample1.cc一共有13行(可執行代碼),全部被執行,測試覆蓋率100%。
具體哪些代碼被測還可以看sample1.cc.gcov文件:

-表示該行不可執行,數字1或其他表示該行被執行了多少次,#####表示代碼沒被執行。

分類: c++ 標簽:

Tuxedo中string導致內存泄漏

2016年4月30日 沒有評論

對象創建的時候會調用構造函數來初始化對象,對象銷毀的時候會調用析構函數。

普通的自動變量(local非static)包含構造函數和析構函數。
當進入變量作用域的時候構造函數被調用,當離開變量作用域的時候析構函數被調用。

當在tuxedo的環境中調用 tpreturn() 或者 tpforward() 函數時,編譯器進行了一個non-local的goto (using longjmp(3)),導致自動變量的析構函數沒有被調用。

為了避免這個問題,我們應該在服務體中調用直接調用 tpreturn()tpforward() (而不是在服務體調用的函數中調用這兩個函數)。

ps:

1.服務體中不能包含包含析構函數的變量,特別是string變量,這些帶析構函數的自動變量需要放到函數調用體中,這樣當離開函數的作用域的時候,會析構這些變量。如果在服務體中有string變量,那么隨著服務循環會有內存泄漏。

2.自動變量需要被嵌套在服務體函數中的大括號{}包圍,大括號需要在調用tpreturn()tpforward() 函數前結束。

可以改為:

附原資料
C++ constructors are called to initialize class objects when those objects are created, and
destructors are invoked when class objects are destroyed.

For automatic (that is, local, non-static) variables that contain constructors and destructors, the constructor is called when the variable comes into scope and the destructor is called when the variable goes out of scope.

However, when you call the tpreturn() or tpforward() function, the compiler performs a non-local goto
(using longjmp(3)) such that destructors for automatic variables are not called.

To avoid this problem, write the application so that you call tpreturn() or tpforward() from the service
routine directly (instead of from any functions that are called from the service routine).

In addition, one of the following should be true:

1 The service routine should not have any automatic variables with destructors (they should
be declared and used in a function called by the service routine).

2 Automatic variables should be declared and used in a nested scope (contained within curly
brackets {}) in such a way that the scope ends before calling the tpreturn() or
tpforward() function.

分類: c++ 標簽:

[0;32m eclipse顯示顏色

2016年4月7日 沒有評論

用 eclipse cdt 運行 gtest 在 console 的輸出結果有有 shell 終端的顏色代碼輸出
Running main() from gmock_main.cc
[==========] Running 4 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 4 tests from PrimeFactors
[ RUN ] PrimeFactors.1factor
[ OK ] PrimeFactors.1factor (0 ms)
[ RUN ] PrimeFactors.2factor
[ OK ] PrimeFactors.2factor (0 ms)
[ RUN ] PrimeFactors.3factor
[ OK ] PrimeFactors.3factor (0 ms)
[ RUN ] PrimeFactors.4factor
[ OK ] PrimeFactors.4factor (0 ms)
[----------] 4 tests from PrimeFactors (0 ms total)

[----------] Global test environment tear-down
[==========] 4 tests from 1 test case ran. (0 ms total)
[ PASSED ] 4 tests.

如何讓 console 的輸出和 shell 中的輸出效果相同。

可以通過在 eclipse market 安裝 ANSI escape 來解決。

分類: c++ 標簽:

gtest和gmock入門實例

2016年1月10日 沒有評論

對于 c++ 來說寫單元測試和 mock 框架不是一件容易的事情。還好, Google 為我們搭建了一個出色的單元測試和 mock 框架。網上的例子很多都過多強調概念,本文用一個簡單的例子讓大家對于什么是 gtest 和 gmock 讓大家有一個直觀的了解,讓大家很快上手,就像寫 hello word 一樣容易。

gtest&gmock 的 1.6 版本的使用 make 編譯,新版的已經已經遷移到 github 上使用 cmake 編譯,安裝過程很多,這里不在重復,如果大家有需要再單獨寫。

1.下載安裝?Google Test?and?Google Mock
2. 編譯生成靜態庫gtest_main.a gmock_main.a (包含main庫后不需要自己寫main函數)

gmock用來對與為實現對象的接口模擬。

我們有一個Messgener.h接口,它的getMessage目前還沒有實現,可以使用mock類提供的宏來模擬,這樣就可以調試客戶端程序,屏蔽Messgener.h的具體實現

Messenger.h 的 mock 類

調用Messenger.h的客戶端程序

HelloWorld.h

HelloWorld.cpp

有了要測試的代碼和依賴的接口的mock模擬類,下面是gtest的單元測試寫法:

單元測試結果
gtest

分類: c++ 標簽: ,

c++虛函數和純虛函數的區別

2015年12月13日 沒有評論

多態是C++的重要特性,通過基類指針來訪問派生類的函數。

虛函數就是為了實現這功能而定義的函數,虛函數可以在定義時實現也可以不實現,定義了虛函數的類可以實例化。

純虛函數更多的是表示接口的含義,純虛函數定義時不能實現,需要在派生的子類中實現且必須實現,含有純虛函數的類不能實例化。

虛析構函數與虛函要成對出現,以便在通過基類指針釋放派生對象時,調用派生類的析構函數。

閱讀全文...

分類: c++ 標簽:

clang: warning: argument unused during compilation: '-pthread'

2015年12月9日 1 條評論

編譯gtest時報了一個警告錯誤,查詢發現有人說重裝clang,可是我不會重裝,不想折騰一直是使用自動升級來更新xcode。
c++ -isystem ../../googletest/include -isystem ../include -g -Wall -Wextra -pthread -lpthread gmock_test.o gmock_main.a -o gmock_test
clang: warning: argument unused during compilation: '-pthread'

后來發現so上有一篇紀實,也就是說clang時編譯時使用這個參數,鏈接的時候時不使用這個參數的,所以可以忽略這個警告。
clang requires -pthread when compiling but not when linking.

This is annoying, but it is observed behavior:

$ clang -c x.cpp
$ clang -pthread -c x.cpp
$ clang -o x x.o
$ clang -pthread -o x x.o
clang: warning: argument unused during compilation: '-pthread'

$ clang --version
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin15.0.0
Thread model: posix

分類: c++ 標簽: ,

mac環境下eclipse cdt開發環境配置

2015年11月28日 沒有評論

本文將一步步介紹如何在osx下配置eclipse開發c++代碼環境和使用實例

安裝前準備

1.安裝過java
2.安裝過xcode

下載安裝eclipse

訪問eclipse網站下載mac版c++開發包,選擇64bit,下載地址
eclipse_url
閱讀全文...

分類: c++, iOS/Mac 標簽:

動態更新運行中程序的配置信息

2014年10月18日 3 條評論

一個程序投產線上使用基本不會停下來,一旦業務需求改變或者增加需求,需要修改配置文件時,往往需要停機修改配置后重新啟動服務。

這個過程進程少還可以接受,如果停一次機要很長時間而且需要授權更新,這個是難以接受的方法。

想了幾個辦法
1.放到內存,例如redis這種字典,這樣可以動態修改redis的值來實現動態更新,問題是如何保證redis出問題不影響原程序呢?
重redis里讀到map,如果需要的配置不在,到內存里去讀,這樣只能增加配置,想要刪除配置好像不理想。

2.定時load配置文件,

3.通過信號load,

2.和3.不好協調多個進程服務一致性問題。

真傷腦筋啊。

有人知道好方法,告訴我一下。

极速快乐十分助手