tag:blogger.com,1999:blog-59465307047421309702024-03-06T16:20:07.273+08:00Jax 的工作紀錄除了在整理學習上的經驗,同時也能幫助其他需要的人Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-5946530704742130970.post-22423910656746150542010-11-10T03:18:00.000+08:002014-01-19T14:34:53.828+08:00[C/C++語言] 解析命令列的參數<pre class="c" name="code">// xxxx.exe -cfg path -tg target
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int status = 0;
for (int i=1; i<argc; i++){
if (!strcmp(argv[i], "-tg")){
i++;
if (i < argc){
printf("target is %s\n",argv[i]);
}else {
status=1; break;
}
}else if (!strcmp(argv[i], "-cfg")){
i++;
if (i < argc){
printf("config path is %s\n",argv[i]);
}else {
status=1; break;
}
}
}
return status;
}
</pre><br />
看到前輩寫的 code,記錄一下,原來很簡單就可以做到。Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com1tag:blogger.com,1999:blog-5946530704742130970.post-76803413136268273332010-10-13T14:44:00.003+08:002014-01-19T14:34:53.835+08:00[C/C++語言] undefined reference to 錯誤排解通常會出現 <strong style="color: red;">undefined reference to `function()'</strong> 這個錯誤有下面這兩個原因:<br />
<ol><li>未連接正確的(靜態/動態)庫,或者是頭文件(*.h)和庫(*.a / *.so / *.dll)版本不匹配。<br />
<pre class="sh" name="code">g++ -o test *.o -L/MyProject/lib -lApiName</pre><br />
</li>
<li>在 C++ 中引用 C 的函數時,有兩種作法:<br />
a.在 C 函數聲明(*.h)中用 extern C{…} 包起來。<br />
<pre class="c" name="code">// file xx-api.h
#ifndef XX_API_H
#define XX_API_H
#ifdef __cplusplus
extern "C" {
#endif
void function_1(const char *srcpath);
int function_2(void);
#ifdef __cplusplus
}
#endif
#endif
</pre><br />
b.或是在 C++ 將 #include 用 extern C{…} 匡起來。<br />
<pre class="c" name="code">extern "C" {
#include "yy-api.h"
}
</pre></li>
</ol><br />
<br />
參考來源:<br />
<a target="_blank" href="http://linux.chinaunix.net/bbs/thread-1053705-1-1.html">void value not ignored as it ought to be</a><br />
<a target="_blank" href="http://fanzhichao.blog.hexun.com/23059419_d.html">我碰到过的编译和连接错误</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-74131460110132656892010-10-07T23:46:00.003+08:002014-01-19T14:34:53.833+08:00[C/C++語言] file_put_contents() 與 file_get_contents()<span style="font-weight:bold;">Base C library :</span><br />
<pre class="c" name="code">#include <stdio.h>
#include <malloc.h>
char* file_get_contents(char* filename){
char *content;
long length;
FILE *fp = fopen(filename, "r");
if(fp == NULL){ return NULL;}
fseek(fp, 0, SEEK_END);
length = ftell(fp);
content = (char*)malloc(length + 1);
fseek(fp, 0, SEEK_SET);
length=0;
while((content[length]=getc(fp)) != EOF) { length++; }
content[length] = '\0';
return content;
}
long file_put_contents(char* filename, char* content){
FILE * fp; int length;
if((fp = fopen(filename, "w")) == NULL){ return -1; }
fputs(content, fp);
fclose(fp);
return length;
}
int main(){
file_put_contents("temp.txt","hello,world! for C \n");
char * contents = file_get_contents("temp.txt");
printf("%s",contents);
return 0;
}
</pre><br />
<br />
<br />
<span style="font-weight:bold;">Base C++ library :</span><br />
<pre class="c" name="code">#include <fstream>
#include <string>
#include <iostream>
using namespace std;
string file_get_contents(char* fileName) {
ifstream file(fileName);
if (!file) { return ""; }
string content = "", line;
while (!file.eof()){
getline(file,line);
content += line+"\n";
}
file.close();
return content;
}
void file_put_contents(char * fileName, char * content) {
ofstream file;
file.open(fileName);
file << content;
file.close();
}
int main() {
file_put_contents("temp.txt", "hello,world! for C++ \n");
cout << file_get_contents("temp.txt");
return 0;
}
</pre><br />
<br />
參考來源:<br />
<a target="_blank" href="http://hi.baidu.com/heyond/blog/item/ff6ea38bfeb40b789e2fb4bd.html">【原创】纯C 实现PHP函数 file_get_contents() file_put_contents()。。。支持远程URL</a><br />
<a target="_blank" href="http://hi.baidu.com/tangtou/blog/item/2022b512614b74c7c3fd7897.html">c++ 版的file_put_contents()和file_get_contents()</a><br />
<a target="_blank" href="http://forum.dobreprogramy.pl/otwarcie-pliku-t413361.html#p2643264">[C++]Otwarcie pliku</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-47668931653827742212010-10-07T23:11:00.006+08:002014-01-19T14:34:53.831+08:00[C/C++語言] Makefile 通用範例<pre class="sh" name="code"><br />SRC_DIR = src<br />OBJ_DIR = obj<br /><br />SOURCES = \<br />$(SRC_DIR)/test2.cpp \<br /><br />TARGET = main.exe<br /><br /><br /># ================================================= <br />INCLUDE_PATH = \<br />#-I"include_path" \<br /><br />NEXUSMGR_LIBDIR = \<br />#-L"library_path" \<br /><br />CXXFLAGS = -O0 -g3 -Wall -fPIC -w -c -fmessage-length=0<br />CFLAGS = -O0 -g3 -Wall -fPIC -w -c -fmessage-length=0<br /><br />LIBS = \<br />#-lsqlite \<br /><br />CC := gcc<br />CXX := g++<br />RM := del /Q<br /><br /># ================================================= <br />OBJS:=$(subst $(SRC_DIR),$(OBJ_DIR),$(SOURCES))<br />OBJS:=$(OBJS:%.cpp=%.cpp.o)<br />OBJS:=$(OBJS:%.C=%.C.o)<br />OBJS:=$(OBJS:%.c=%.c.o)<br /><br />$(OBJ_DIR)/%.cpp.o: $(SRC_DIR)/%.cpp<br /> $(CXX) $(CXXFLAGS) $(INCLUDE_PATH) -MMD -MP -MF $(@:%.o=%.d) -MT $(@:%.o=%.d) -o $@ $< <br /> <br />$(OBJ_DIR)/%.C.o: $(SRC_DIR)/%.C<br /> $(CXX) $(CXXFLAGS) $(INCLUDE_PATH) -MMD -MP -MF $(@:%.o=%.d) -MT $(@:%.o=%.d) -o $@ $< <br /> <br />$(OBJ_DIR)/%.c.o: $(SRC_DIR)/%.c<br /> $(CC) $(CFLAGS) $(INCLUDE_PATH) -MMD -MP -MF $(@:%.o=%.d) -MT $(@:%.o=%.d) -o $@ $<<br /> <br /><br />$(TARGET): $(OBJS)<br /> $(CXX) $(NEXUSMGR_LIBDIR) -o $(TARGET) $(OBJS) $(LIBS)<br /><br />$(OBJ_DIR):<br /> -mkdir $(OBJ_DIR)<br /><br />all: $(OBJ_DIR) $(TARGET)<br /><br />clean:<br /> -$(RM) $(OBJ_DIR) $(TARGET)<br /></pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-41888335618211310102010-09-03T03:28:00.009+08:002014-01-19T14:34:53.830+08:00用 Eclipse CDT 編譯 CppSQLite3工作上為了讓 sqlite 可以在 platform 上執行,所以必須從完整的 source code 開始編譯,對於不怎麼熟悉 Makefile 的我這真是一件麻煩的事,還好以前有玩過 CDT,索性就利用他可以自動建立 Makefile 的功能來做。<br /><br />不過我是使用 Eclipse 3.2 版的 CDT,Eclipse 3.5 的 CDT 裡的 Makefile 我不太會用,也沒有時間去找文章。<br /><br /><br />這裡我下載了兩個檔案:<br /><a href="http://www.sqlite.org/download.html">SQLite</a> -> <a href="http://www.sqlite.org/sqlite-source-3_7_2.zip">sqlite-source-3_7_2.zip</a><br /><a href="http://www.codeproject.com/KB/database/CppSQLite.aspx">CppSQLite</a> -> <a href="http://www.codeproject.com/KB/database/CppSQLite/CppSQLite_3_1_demo_and_src.zip">CppSQLite_3_1_demo_and_src.zip</a><br /><br /><br /><span style="font-weight: bold;">首先建立動態連結庫</span><ol><li>新增 "Managed Make C++ Project" 專案 -> 名稱 "cppsqlite"<br /><br /></li><li>在 Project Type 中選擇 <span style="color: rgb(255, 0, 0);">Shared Library</span><br /><br /></li><li>在專案下新增 src 資料夾<br /><br /></li><li>複製 sqlite-source-3_7_2.zip 中所有的 source code 至 src 除了 <span style="color: rgb(255, 0, 0);">shell.c</span> 與 <span style="color: rgb(255, 0, 0);">tclsqlite.c</span><br /><br /></li><li>再複製 CppSQLite_3_1_demo_and_src.zip 中的 <span style="color: rgb(255, 0, 0);">CppSQLite3.h</span> 與 <span style="color: rgb(255, 0, 0);">CppSQLite3.cpp</span><br /><br /></li><li>開啟:專案 -> 內容<br /><br /></li><li>增加 Defined symbols 變數 -> <span style="color: rgb(255, 0, 0);">SQLITE_CORE</span><br /><a href="http://lh5.ggpht.com/_b8lN_UbLoEc/TIIP-Gx6E-I/AAAAAAAAHrk/NJOKCIUoyMk/s1600-h/cppsqlite3-1.png"><img src="http://lh5.ggpht.com/_b8lN_UbLoEc/TIIP-Gx6E-I/AAAAAAAAHrk/NJOKCIUoyMk/s256/cppsqlite3-1.png" alt="" id="BLOGGER_PHOTO_ID_5512986453501154274" border="0" /></a><br /><br /></li><li>在 C++ 跟 C 的 Optimization 的參數中增加 <span style="color: rgb(255, 0, 0);">-fPIC</span> 最佳化參數<br /><a href="http://lh5.ggpht.com/_b8lN_UbLoEc/TIIP-RQddXI/AAAAAAAAHro/Hqn5DptWRl4/s1600-h/cppsqlite3-2.png"><img src="http://lh5.ggpht.com/_b8lN_UbLoEc/TIIP-RQddXI/AAAAAAAAHro/Hqn5DptWRl4/s256/cppsqlite3-2.png" alt="" id="BLOGGER_PHOTO_ID_5512986456313656690" border="0" /></a><br /><br /></li><li>按下『確定』後就會開始編譯,檔案有點多要稍微等一下</li></ol><br /><br /><br /><span style="font-weight: bold;">再來建立主程式專案</span><ol><li>新增 "Managed Make C++ Project" 專案 -> 名稱 "sqlite-test"<br /><br /></li><li>在 Project Type 中選擇 <span style="color: rgb(255, 0, 0);">Executable</span><br /><br /></li><li>在專案下新增 src 資料夾<br /><br /></li><li>複製 CppSQLite_3_1_demo_and_src.zip 中的 <span style="color: rgb(255, 0, 0);">CppSQLite3Demo.cpp</span> 至 src<br /><br /></li><li>開啟:專案 -> 內容<br /><br /></li><li>新增 Include paths -> <span style="color: rgb(255, 0, 0);">"../../cppsqlite/src"</span><br />這個設定是在告知<span style="color: rgb(255, 0, 0);">編譯</span>時額外 Include 的進來 <span style="color: rgb(255, 0, 0);">Header(*.h)</span> 的路徑。<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS_sPYCgOpEypPgrvgOX_OrmlGt_LQ_VBG2tpRgPAijQz5VgEqxdF3IzcgWZg-ASAKsfxRhYd-K95A4dckCUQQprPX4IjFm-a1FUqOt1jRblLwMxRT5HXKdM3ejPlFmBVNw9ZSKnieGYAM/s1600-h/cppsqlite3-3.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS_sPYCgOpEypPgrvgOX_OrmlGt_LQ_VBG2tpRgPAijQz5VgEqxdF3IzcgWZg-ASAKsfxRhYd-K95A4dckCUQQprPX4IjFm-a1FUqOt1jRblLwMxRT5HXKdM3ejPlFmBVNw9ZSKnieGYAM/s256/cppsqlite3-3.png" alt="" id="BLOGGER_PHOTO_ID_5512986460108193122" border="0" /></a><br /><br /></li><li>新增連結路徑:<br />Library search path -> <span style="color: rgb(255, 0, 0);">"../../cppsqlite/Debug"</span><br />Libraries -> <span style="color: rgb(255, 0, 0);">cppsqlite</span><br />這個設定是給 gcc 在做<span style="color: rgb(255, 0, 0);">連結</span>時需要的搜尋路徑,以及需要連結的<span style="color: rgb(255, 0, 0);">對象名稱</span>。<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrneIIAaN6Mo-HpfGZp0Vyt0u7NZgyiS-KmHkZD86SU2iBq5A2aWbT03ANRF9tTcFeJWTmlhpLezs_cKHYiBhiISQL7uJyvtDGW_CR97RqZX1m5LIEdA9kN4aAK_nuBPizGVbcBE0vMe6j/s1600-h/cppsqlite3-4.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrneIIAaN6Mo-HpfGZp0Vyt0u7NZgyiS-KmHkZD86SU2iBq5A2aWbT03ANRF9tTcFeJWTmlhpLezs_cKHYiBhiISQL7uJyvtDGW_CR97RqZX1m5LIEdA9kN4aAK_nuBPizGVbcBE0vMe6j/s256/cppsqlite3-4.png" alt="" id="BLOGGER_PHOTO_ID_5512986459036050930" border="0" /></a><br /><br /></li><li>按下『確定』後就會開始編譯<br /><br /></li><li>接著要將 cppsqlite.dll 複製到 sqlite-test/Debug 下<br /><span style="color: rgb(204, 0, 0);">Windows 的 lib 名稱為 "cppsqlite<span style="color: rgb(0, 0, 153);">.dll</span>"</span><br /><span style="color: rgb(204, 0, 0);">Linux 的 lib 名稱為 "<span style="color: rgb(0, 0, 153);">lib</span>cppsqlite<span style="color: rgb(0, 0, 153);">.so</span>"</span><br /><br /></li><li>然後就可以執行 sqlite-test.exe 了 <span style="color: rgb(102, 102, 102);font-size:85%;" >(一整個就很快樂)</span></li></ol><span style="font-weight: bold;">專案範例:</span><a style="font-weight: bold;" href="https://sites.google.com/site/weskerjax/code-demo/sqlite-test.zip?attredirects=0&d=1">sqlite-test.zip</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0