项目中有一个sqC产生的实体调用方法时,始终报818错。删掉bnd得编问题照旧。在同事的提示下--所有sqC文件名的前8个字符不能一样--,找到重复文件重命名,删掉BND文件,重编译,搞定。
一、环境 编译工具:VS2012 Express
操作系统:Win7旗舰版 64
SVN客户端
二、下载
三、编译
1、打开VS2012 开发人员命令提示。
2、cd v8目录。
3、执行命令:
third_party\python_26\python.exe build\gyp_v8 -G msvs_version=2010
系统显示
Updating projects from gyp files...
4、在命令行中输入:build\all.sln,回车。
5、系统自动打开VS2012 IDE环境。
6、在IDE环境项目菜单中,更新项目,升级项目文件。
7、编译。
/////////////////////////////////////////////////////////////////////////////////////
/// daemon 测试类
#include <unistd.h>
#include <syslog.h>
#include <stdlib.h>
#include "daemon.h"
class logger : public daemon
{
public:
logger() : daemon("日志")
{}
void do_something()
{
while(true)
{
syslog (LOG_NOTICE, "Writing to my Syslog");
sleep(5);
}
}
};
int main(int argc, char *argv[]) {
logger l;
l.run();
return 0;
}
////////////////////////////////////////////////////////////////////////////
// .h
#ifndef DAEMON_H
#define DAEMON_H
#include <string>
class daemon{
public:
const std::string name;
public:
daemon(const char* nm);
void run();
private:
static void fork_off_parent();
static void set_child_context();
virtual void open_log();
virtual void do_something() =0;
virtual void finish();
private:
daemon(const daemon&);
daemon& operator=(const daemon&);
};
#endif // DAEMON_H
/////////////////////////////////////////////////////////////////////////////////
// .cpp
/*
* cp from http://shahmirj.com/blog/beginners-guide-to-creating-a-daemon-in-linux
*/
#include "daemon.h"
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
daemon::daemon(const char *nm) : name(nm)
{}
void daemon::run()
{
fork_off_parent();
set_child_context();
open_log();
do_something();
finish();
}
void daemon::fork_off_parent()
{
//Fork the Parent Process
pid_t pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
//We got a good pid, Close the Parent Process
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
}
void daemon::set_child_context()
{
//Change File Mask
umask(0);
//Create a new Signature Id for our child
pid_t sid = setsid();
if (sid < 0)
{
exit(EXIT_FAILURE);
}
//Change Directory
//If we cant find the directory we exit with failure.
if ((chdir("/")) < 0)
{
exit(EXIT_FAILURE);
}
//Close Standard File Descriptors
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
}
void daemon::open_log()
{
//Set our Logging Mask and open the Log
setlogmask(LOG_UPTO(LOG_NOTICE));
openlog(name.c_str(), LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
syslog(LOG_INFO, "Entering Daemon");
}
void daemon::finish()
{
//Close the log
closelog ();
}
在Windows7下使用Qt creator开发程序,想直接在源代码中使用中文字符串常量,源码是utf8的,保持utf8是便于迁移到linux,VC编译器总是报错,串中有换行符,怪异的是如果恰好串只有两个中文字符时,一切都是那么美好,多了,VC编译器就会让你痛苦了。
经过一番google,我总结了解决问题的原则:
绝对不要在源码中使用中文字符串常量。
那要显示的中文怎么做?用Qt Linguist.
下面是方法:
第一步:打开.pro文件,在最后面加入一行
TRANSLATIONS = cn.ts
可以自由命名右边的.ts文件
第二步:选择菜单:工具/外部/Qt翻译家/更新翻译(lupdate)
此时,系统将在.pro文件所在目录生成cn.ts文件
第三步:打开cn.ts文件,注意是用菜单:打开文件,用...。这种方式,在对话框中选择
Qt Linguist
第四步:在Qt Linguist中,汉化找到的源代码中的字符串常量。
第五步:完成汉化后,保存并选择【发布】。系统会在cn.ts文件所在目录生成cn.qm文件。
第六步:把汉文件文件添加到,项目资源中。打开.qrc文件,添加cn.qm文件
/tr
cn.qm
第七步:使用汉化结果. 在主窗口显示前,应用实例创建后安装翻译器。
QApplication a(argc, argv);
QTranslator translator;
translator.load(":tr/cn.qm");
a.installTranslator(&translator);
经验:有些时候明明已经翻译了,程序还是不生效,此时你可以选择【清理项目】后再次构建,试一下。
1、项目目录规划
在project_dir下建立build, cmake, src三个目录。
2、按照CMake要求,为项目编写CMakeLists.txt文件。
3、调用CMake命令为eclipse生成项目文件,我把这些命令写成脚本来执行:
make_project.sh
#!/bin/sh
mkdir -p build/release
mkdir -p build/debug
cmake -E chdir build/release cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=release ../../
cmake -E chdir build/debug cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=debug ../../
4、打开eclipse,选择菜单:文件/ 导入/常规/现有项目到工作空间中.。在“导入”对话框中,在“选择根目录”项目中指定目录为project_dir/build.
eclipse会自动搜索到debug, release两个目录下的项目。
点击“完成”按钮。eclipse将自动加入项目。
5、build项目。
6、调试项目时,你需要在菜单:运行/调试配置 里新增配置信息,指定执行文件的路径。
图本身没有什么特别的,只是用来分析任务队列,图是用来推理的。
一、wxFormBuilder选择utf8生成的cpp代码,是无代码签名的,VS2008 express编译过程中可能会出现字符串错误。
解决办法是:打开文件菜单,选择保存高级选项,在“编码”中选择“unicode - 代码页1200”,确定后,重新编译。
二、wxFormBuilder制作wxFlexGridSizer布局时,其默认rows,cols都是2,这个值不会自动变化,因此,你添加了超个2*2个窗体后,生成的cpp代码可以顺利编译,但运行过程会报超过2*2的错。
解决办法:调整rows, cols值。
更正:方法一,更简单的处理是在项目属性中勾选c++ properties/ use_microsoft_bom 设置,这样生成的cpp文件,VS2008 Express 无碍编译。
跑题
据说Oracle Berkeley DB"很好",就去试用一下,但是,它,很不给我面子,在put了半天之后,我想get一下写入的东西,运行正常,但没有结果返回,看了几遍帮助,copy文档的代码,也是这个结果,就很是郁闷了。没有太多的时间去追究问题,还好世上还有一些“美好”的东西。sqlite,也是嵌入数据库,据说它快但是比Oracle Berkeley DB“逊色”,但Oracle Berkeley DB 11g的sql引擎是用sqlite的,最重要的它还是免费的。
有兴趣了解的朋友可以去这里看一下。
http://www.bdbchina.com/2010/03/oracle-berkeley-db-%E6%94%AF%E6%8C%81sql%E5%95%A6%EF%BC%81/BDB中国研发团队的博客,讲了一些与sqlite的关系。这里摘录一下:
“Oracle Berkeley DB引入了SQLite的SQL层:包括用户接口(sqlite3(), ODBC, JDBC等)和SQL语言处理层(Tokenizer、Parser及Generator),而底层引擎(虚拟机)则使用了BDB的存储引擎。从而,将原来SQLite基于数据库级别的并发提升一个级别 - 至BDB的基于页(Page)级别的并发,并可以利用BDB的更好的内存管理、数据和事务恢复功能、更多的扩展(如Berkeley DB的db_hotbackup、db_stat、db_archive等一系列命令行工具)。”
“
Berkeley DB SQL和SQLite使用上的区别
a) 对于用户和开发人员来说,这两个产品是没有区别的。它们在SQL语法、API、命令行交互、PRAGAMAs 等方面都是一致的。我认为,用户可以体验的显著区别有可能是性能和并发了 - 由于SQLite提供的是数据库级别的锁,而Berkeley DB SQL是页(Page)级别的锁,因此后者在绝大多数测试中都会快很多 (如Insert, Update, Delete, 并发操作等)。但是,由于DBSQL提供的细粒度锁的机制,它又会带来一些额外的开销,一些极端的测试用例下会比SQLite慢上少许(但不明显)。并且对于这些极端测试的案例,我们一直在进行性能优化。
b) 对于已有的SQLite应用程序和工具而言,由于这两者在调用接口都是一致的,因而都可以无缝支持。
c) 对于DBA人员来说,除了可以继续使用SQLite原来的管理工具,您还可以使用BDB提供的db_hotbackup、db_stat、db_archive等一系列命令行工具来备份,监控,升级等。另外,您还可以联系Oracle寻求支持。
总体而言,我们有充分理由相信Oracle Berkeley DB SQL将会比SQLite更快,更稳定。同时,我们也将会提供更好的支持服务。
”
正题
使用http://sqlitewrapper.kompex-online.com/ Kompex SQLite Wrapper 呵呵,超好用
完了
本想用wcsftime,_wcsftime_l来简化时间格式化操作,显示中文时间,于是就这样整:
wchar_t buf[128];
wcsftime(buf, 128, L"%y年%m月%d ...." ...)
谁知道执行成功,但buf里边内容为空,注意不是"\0",是什么也没有返回. 东找西查,可能是local相关问题。
好,我设置 "CHS",OK,(调试。。),再F5 , NND,sqlite又报一个互斥量错误,额的娘哟!消灭一个问题,又引入一个新问题。。。立即痴呆3分钟:-(。
好了,好了,惹来起,躲得起,我可不会去探寻为什么sqlite会不给面子,不然这一天又过去了。
还好,有数据,毛老人家讲“自力更生,丰衣足食”,wcsprintf一样的可用。。。
第一次,我在写一个MFC程序,用CFile打开文件时,我认为当前路径==程序路径,文件名没有采用绝对路径。在程序执行过程中,没有打开任何文件对话框时,我的想当然是对的,可是只要弹出一个文件对话后,我就跌入了沼泽,耗时三天,才发现文件对话框是要更改当前路径的。
每二次,我在写一个服务时,一个函数里边要打开读取一个文件,在非服务程序的执行过程中,函数表现正常。当我转换成服务,在主函中调用它后,在服务启动运行期间,它运行不正常。我又认为当前路径==程序路径,文件打开失败,调试了一下午才找出原因。
“同一个错误,不能犯两次”