1、安裝scons
(1) 下載python2.7, 使用x86_32位,因為scons只有32位安裝包可用;
(2) 下載scons2.3.0;
(3) 安裝python 和 scons, 將C:\Python27\Scripts寫入PATH;
(4) 下載安裝pywin32 ,It is recommended you install pywin32 if you want to do parallel builds (scons -j)
2、安裝boost庫(1.49版本).
解壓後雙擊bootstrap.bat,生成bjam.exe後,cd到目錄c:\boost下,(將boost_1_49更名為boost了)編譯boost。
編譯命令:C:\boost>bjam variant=release --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32
這是使用VS2010環境編譯的release版本,編譯完成後,生成C:\boost\stage\lib文件夾,下面有6個lib庫:
如果要編譯成debug版本,使用命令:bjam variant=debug --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32
編譯完成後,生成C:\boost\stage\lib文件夾,下面有10個lib庫和dll:
此處為MongoDB文檔中對於編譯boost庫的要求原文:
When using bjam, MongoDB expects
variant=debug for debug builds, and variant=release for release builds
threading=multi
link=static runtime-link=static for release builds
address-model=64 for 64 bit(64位的話,把32換為64)。link=static runtime-link=static,boost需要編譯成靜態庫,因為mongodb只會去鏈接boost的靜態庫
address-model=64在win7 64環境下此項必須,不加在編譯mongodb的c++ client時會出現鏈接錯誤。
3、下載mongo2.4.6源碼 http://www.mongodb.org/downloads官網下載
編譯Mongoclient.lib
cmd命令提示符下,cd到解壓後的文件目錄,例如我放在了E盤,E:\mongodb-src-r2.4.6,輸入命令:
scons –-dd --32 mongoclient.lib // build C++ client driver library
Add --64 or --32 to get the 64- and 32-bit versions, respectively. Replace --release with --dd to build a debug build.
編譯後在mongodb\build\win32\32\dd\client_build\生成mongoclient.lib.
4、測試程序
就用Mongodb自帶的例子吧,使用VS2010打開E:\mongodb-src-r2.4.6\src\mongo\client\examples中的simple_client_demo.vcxproj,編譯,會提示生成simple_client_demo.sln,保存。
使用debug模式,配置工程環境:打開工程->屬性,配置Configuration Properties下的VC++ Directories,頭文件路徑添加C:\boost,Lib庫路徑添加boost的lib,以及mongodb client的lib:
C:\boost\stage\lib
E:\mongodb-src-r2.4.6\build\win32\32\dd\client_build
進入C/C++下面的Code Generation,將Runtime Library設置為Multi-threaded Debug (/MTd)
進入Linker下面的Input,設置Additional Dependencies,添加ws2_32.lib,psapi.lib,Dbghelp.lib,mongoclient.lib
將E:\mongodb-src-r2.4.6\build\win32\32\dd\mongo\base下生成的error_codes.h和error_codes.cpp文件,拷貝到E:\mongodb-src-r2.4.6\src\mongo\base目錄下。
ok,編譯、運行.
5、問題解決
error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(dbclient.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(assert_util.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(jsobj.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(status.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(mutexdebugger.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
VS的版本不匹配,lib是在更高級的版本中編譯生成的,而使用的時候,是在低級版本中使用的,所以出現了不匹配的錯誤。例如,我在VS2010 SP1和VS2012的環境下編譯的,而使用是在VS2010上使用,所以在編譯時,出現了以上問題。
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymCleanup
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymGetMoleInfo64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymInitialize
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_StackWalk64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymFromAddr
在工程依賴庫中添加Dbghelp.lib
其它問題,看看你手頭的編譯器、編譯出來的boost庫版本、mongoclient.lib的版本,是否對應好了。
Ⅱ win下怎樣編譯mongodb
Mongodb 是採用 Scons 來構建的。Scons是一個Python寫的自動化構建工具,從構建這個角度說,它跟GNU make是同一類的工具。所以要編譯MongoDB的C語言驅動,不僅要有C/C++開發環境,而且還要有Python環境及Scons庫。
編譯環境:Windows 2008 + Visual Studio 2010 + Python 2.7 + SCons 2.3.0;其中Python編譯器主要有兩個版本(2.7和3.x),請務必安裝Python2.7,因為SCons2.3.0僅支持Python2.x編譯器,並且Python2.7是當前使用最為廣泛的版本。
下載地址:
Python2.7 http://www.python.org/download/releases/2.7.5/
SCons2.3.0 http://www.scons.org/
Mongo-c-driver https://github.com/mongodb/mongo-c-driver(GitHub託管)
假設當前操作系統上已經配置了C/C++開發環境(Visual Studio 2010);首先安裝Python2.7,安裝目錄默認為C:/Python27;然後安裝Scons2.3.0,安裝Scons2.3.0時會自動檢測Python安裝目錄,並將安裝到Python中的Scripts目錄;增加環境變數: C:\Python27 與 C:\Python27\Scripts 到PATH;編譯環境搭建完畢。
下載mongo-c-driver並解壓,在「命令提示符」(DOS模擬環境cmd.exe)下進入到mongo-c-driver的解壓目錄,例如解壓到C盤根目錄,則路徑為C:\mongo-c-driver-master;在C:\mongo-c-driver-master>提示符下,輸入SCons –m32 –c99回車即可;編譯完成後會在mongo-c-driver目錄中生成兩個動態鏈接庫bson.dll和mongoc.dll,以及相應的bson.lib和mongoc.lib。
註:在開發程序進行編譯時,需要在項目屬性中配置「C/C++「->「預處理器定義」,預定義四個宏MONGO_HAVE_STDINT,MONGO_HAVE_UNISTD,MONGO_USE__INT64,MONGO_USE_LONG_LONG_INT;在"VC++目錄」->「包含目錄"中,添加C:\mongo-c-driver-master\src目錄,包含mongo-c-driver頭文件目錄;在"鏈接器」->「輸入」->「附加依賴項"中,添加bson.lib和mongoc.lib庫,鏈接mongo-c-driver庫,即可編譯程序。
Ⅲ 怎樣使用Scons生成 交叉編譯的動態庫
第一步,我先從簡單的調用出發,定義了一個簡單的函數,該函數僅僅實現一個整數加法求和:
LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 導入定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a,int b);
}
在C#中調用測試:
int iSum = RefComm.mySum(,);
運行查看結果iSum為5,調用正確。第一步試驗完成,說明在C#中能夠調用自定義的動態鏈接庫函數。
第二步,我定義了字元串操作的函數(簡單起見,還是採用前面的函數名),返回結果為字元串:
LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a); return a;}
C# 導入定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中調用測試:
string strDest="";
string strTmp= RefComm.mySum("45", strDest);
運行查看結果 strTmp 為"45",但是strDest為空。我修改動態鏈接庫實現,返回結果為串b:
LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a) return b;}
修改 C# 導入定義,將串b修改為ref方式:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再調用測試:
string strDest="";
string strTmp= RefComm.mySum("45", ref strDest);
運行查看結果 strTmp 和 strDest 均不對,含不可見字元。再修改 C# 導入定義,將CharSet從Auto修改為Ansi:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中再調用測試:
string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
運行查看結果 strTmp 為"45",但是串 strDest 沒有賦值。第二步實現函數返回串,但是在函數出口參數中沒能進行輸出。再次修改 C# 導入定義,將串b修改為引用(ref):
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
運行時調用失敗,不能繼續執行。
第三步,修改動態鏈接庫實現,將b修改為雙重指針:
LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),"%s",a); return *b;}
C#導入定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中調用測試:
string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
運行查看結果 strTmp 和 strDest 均為"45",調用正確。第三步實現了函數出口參數正確輸出結果。
第四步,修改動態鏈接庫實現,實現整數參數的輸出:
LIBEXPORT_API int mySum(int a,int b,int *c){ *c=a+b; return *c;}
C#導入的定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a, int b,ref int c);
}
在C#中調用測試:
int c=0;
int iSum= RefComm. mySum(,, ref c);
運行查看結果iSum 和c均為5,調用正確。
經過以上幾個步驟的試驗,基本掌握了如何定義動態庫函數以及如何在 C# 定義導入,有此基礎,很快我實現了變長加密函數在 C# 中的調用,至此目標實現。
三、結論
在 C# 中調用 C++ 編寫的動態鏈接庫函數,如果需要出口參數輸出,則需要使用指針,對於字元串,則需要使用雙重指針,對於 C# 的導入定義,則需要使用引用(ref)定義。
對於函數返回值,C# 導入定義和 C++ 動態庫函數聲明定義需要保持一致,否則會出現函數調用失敗。定義導入時,一定注意 CharSet 和 CallingConvention 參數,否則導致調用失敗或結果異常。運行時,動態鏈接庫放在 C# 程序的目錄下即可,我這里是一個 C# 的動態鏈接庫,兩個動態鏈接庫就在同一個目錄下運行。
Ⅳ 怎麼用scons+vs編譯blender 入門版
擇text Editor模式,然後打開python文件,ALT+P編譯。 (注意一定要安裝python編譯器)
Ⅳ 請教Scons python 編譯問題
哈哈,解決問題的方法不可思議,我看了半天main.py後,就把那2個代碼SConstruct 和SConscript拷到python的根目錄下,居然編譯一大半,不過還有問題,請幫助我;提示如下
E:\svn_rt-thread\rt-thread\bsp\mini2440>scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build\bsp
armcc -o build\bsp\application.o -c --device DARMSS9 --apcs=interwork --diag_sup
press=870 -I"C:\Keil\ARM\BIN30/ARM/RV31/INC" -g -O0 -IE:\svn_rt-thread\rt-thread
\include -IE:\svn_rt-thread\rt-thread\libcpu\arm\s3c24x0 -IE:\svn_rt-thread\rt-t
hread\libcpu\arm\common -I. -IE:\svn_rt-thread\rt-thread -IE:\svn_rt-thread\rt-t
hread\components\finsh -IE:\svn_rt-thread\rt-thread\components\dfs -IE:\svn_rt-t
hread\rt-thread\components\dfs\include -IE:\svn_rt-thread\rt-thread\components\r
tgui\include -IE:\svn_rt-thread\rt-thread\components\rgtui\common -IE:\svn_rt-th
read\rt-thread\components\rtgui\server -IE:\svn_rt-thread\rt-thread\components\r
tgui\widgets application.c
'armcc' 不是內部或外部命令,也不是可運行的程序
或批處理文件。
scons: *** [build\bsp\application.o] Error 1
scons: building terminated because of errors.
E:\svn_rt-thread\rt-thread\bsp\mini2440>
以下圖片
Ⅵ 請教Scons python 編譯問題
一、概述
scons是一個Python寫的自動化構建工具,和GNU make相比優點明顯:
1、移植性:python能運行的地方,就能運行scons
2、擴展性:理論上scons只是提供了python的類,scons使用者可以在這個類的基礎上做所有python能做的事情。比如想把一個已經使用了Makefile大型工程切換到scons,就可以保留原來的Makefile,並用python解析Makefile中的編譯選項、源/目標文件等,作為參數傳遞給scons,完成編譯。
3、智能:Scons繼承了autoconf/automake的功能,自動解析系統的include路徑、typedef等;「以全局的觀點來看所有的依賴關系」
二、scons文件
scons中可能出現的文件:
SConstruct,Sconstruct,sconstruct,SConscript
scons將在當前目錄以下次序 SConstruct,Sconstruct,sconstruct 來搜索配置文件,從讀取的第一個文件中讀取相關配置。
在配置文件SConstruct中可以使用函數SConscript()函數來定附屬的配置文件。按慣例,這些附屬配置文件被命名為」SConscript」,當然也可以使用任意其它名字。
三、scons的命令行參數
scons: 執行SConstruct中腳本
scons -c clean
scons -Q 只顯示編譯信息,去除多餘的列印信息
scons -Q --implicit-cache hello 保存依賴關系
--implicit-deps-changed 強制更新依賴關系
--implicit-deps-unchanged 強制使用原先的依賴關系,即使已經改變
四、SConstruct提供的方法
1、Program:生成可執行文件
Program('hello.c') 編譯hello.c可執行文件,根據系統自動生成(hello.exe on Windows; hello on POSIX)
Program('hello','hello.c') 指定Output文件名(hello.exe on Windows; hello on POSIX)
Program(['hello.c', 'file1.c', 'file2.c']) 編譯多個文件,Output文件名以第一個文件命名
Program(source = "hello.c",target = "hello")
Program(target = "hello" , source = "hello.c")
Program('hello', Split('hello.c file1.c file2.c')) 編譯多個文件
Program(Glob("*.c"))
src = ["hello.c","foo.c"];Program(src)
2、Object:生成目標文件
Object('hello.c') 編譯hello.c目標文件,根據系統自動生成(hello.obj on Windows; hello.o on POSIX)
3、Library:生成靜態/動態庫文件
Library('foo', ['f1.c', 'f2.c', 'f3.c']) 編譯library
SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) 編譯 shared library
StaticLibrary('bar', ['f4.c', 'f5.c', 'f6.c']) 編譯 static library
庫的使用:
Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.') 連接庫,不需加後綴或是前綴
4、SourceSignatures:判斷源文件是否修改
SourceSignatures('MD5') 根據內容是否改變,默認方式
SourceSignatures('timestamp') 根據修改時間
5、TargetSignatures:判斷目標文件是否改變
TargetSignatures('build') 根據編譯結果
TargetSignatures('content') 根據文件內容,如果只是加了句注釋,將不會被重新編譯
6、Ignore:忽略依賴關系
Ignore(hello, 'hello.h') 忽略某個依賴關系
7、Depends:明確依賴關系
Depends(hello, 'other_file') 明確依賴關系
8、SConscript:scons的配置文件。
源文件的目錄結構如下:
src:
| SConstruct
|test.cpp
| mA(目錄):
| SConscript
| func.cpp
其中test.cpp為主文件,中調用func.cpp中定義的函數
SConstruct內容如下:
[cpp]view plain
subobj=SConscript(['mA/SConscript'])
obj=subobj+Object(Glob("*.cpp"))
Program("test",list(obj))
[cpp]view plain
obj=Object(Glob("*.cpp"))
Return("obj")
10.env:環境變數
環境變數用於設置在編譯過程中的各種參數,可以用下面的SConstruct列印環境變數的所有信息(實際上env就是一個python字典)
可以使用如下的SConstruct查看環境變數的內容:
[cpp]view plain
env=Environment()
dict=env.Dictionary()
keys=dict.keys()
keys.sort()
forkeyinkeys:
print"constructionvariable='%s',value='%s'"%(key,dict[key])
環境變數的復制:
env = Environment(CC = 'gcc')
opt = env.Clone(CCFLAGS = '-O2')
dbg = env.Clone(CCFLAGS = '-g')
環境變數的替換:
env = Environment(CCFLAGS = '-DDEFINE1')
env.Replace(CCFLAGS = '-DDEFINE2')
env.Program('foo.c')
環境變數的輸入輸出:用於統一多目錄源文件的編譯選項,如:
src:
| SConstruct
| libstlport.a
| test.cpp
| include(目錄):
| foo.h
| mA(目錄):
| SConscript
|func.cpp
test.cpp和mA/func.cpp都引用了include/foo.h,test.cpp調用了mA/func.cpp的功能函數,其中include/foo.h中定義了一個包含string類型的類。
SConstruct如下:
[cpp]view plain
env=Environment()
flags=env.ParseFlags(['-pthread-I/usr/include/stlport','-L.'])
env.MergeFlags(class_flags)
subobj=SConscript(['mA/SConscript'])
obj=subobj+env.Object(Glob("*.cpp"))
env.Program("test",list(obj),LIBS=['libstlport.a'])
mA/SConscrip如下:
[cpp]view plain
obj=Object(Glob("*.cpp"))
Return("obj")
不出意外的話上邊的工程編譯可以通過,但是運行的時候會Aborted。因為test.cpp,mA/func.cpp都使用了包含string類型的那個類,但是由於編譯環境的不同,test.cpp認為string變數的大小是24位元組, mA/func.cpp認為string變數的大小是4個位元組(libstlport.a搗的鬼)。
解決問題的辦法就是環境變數輸出,修改SConstruct和mA/SConscript如下:
SConstruct:
[cpp]view plain
env=Environment()
flags=env.ParseFlags(['-pthread-I/usr/include/stlport','-L.'])
env.MergeFlags(class_flags)
Export('env')
subobj=SConscript(['mA/SConscript'],exports='env')
obj=subobj+env.Object(Glob("*.cpp"))
env.Program("test",list(obj),LIBS=['libstlport.a'])
Ⅶ scons怎麼編譯別的文件夾 ubuntu
因為SCons是用Python編寫的,所以你必須在使用SCons之前安裝好Python。你在安裝Python之前,應該注意查看Python是否在你的系統里已經可用了(在系統的命令行中運行python -V或python --version)。
$python -V
Python 2.5.1
在一個Windows系統里,
C:\>python -V
Python 2.5.1
如果Python沒有安裝,你會看到一條錯誤消息比如「command not found」(在UNIX或Linux里)或"python is not recognized as an internal or external command, operable program or batch file"(在Windows里)。在這種情況下,在你安裝SCons之前需要先安裝Python。
有關下載和安裝Python的信息可以從http://www.python.org/download/得到。
2、從預編譯包中安裝SCons
2.1、在Red Hat(或者基於RPM)Linux系統里安裝SCons
在使用RPM(Red Hat Package Manager)的Red Hat Linux,Fedora或者任何其他Linux發行版里,SCons是預編譯好的RPM格式,准備被安裝的。你的發行版可能已經包含了一個預編譯好的SCons RPM。
如果你的發行版支持yum安裝,你可以運行如下命令安裝SCons:
#yum install scons
如果你的Linux發行版沒有包含一個特定的SCons RPM文件,你可以下載SCons項目提供的通用的RPM來安裝。這會安裝SCons腳本到/usr/bin目錄,安裝SCons庫模塊(library moles)到/usr/lib/scons。
從命令行安裝,下載合適的.rpm文件,然後運行:
#rpm -Uvh scons-2.1.0-1.noarch.rpm
2.2、在Debian Linux系統里安裝SCons
如果你的系統已經連上了網際網路,你可以運行如下命令來安裝最新的官方Debian包:
#apt-get install scons
2.3、在Windows系統里安裝SCons
SCons提供了一個Windows installer,使得安裝變得非常容易。從http://www.scons.org/download.php下載scons-2.1.0.win32.exe。然後你需要做的就是執行這個文件。
3、在任何系統里編譯和安裝SCons
如果你的系統里沒有一個預編譯的SCons包,你可以使用本地python distutils包很容易地編譯和安裝SCons。
第一步就是下載scons-2.1.0.tar.gz或scons-2.1.0.zip,地址http://www.scons.org/download.html。
解壓下載的文件,會創建一個叫scons-2.1.0的目錄,進入這個目錄執行如下命令安裝SCons:
#cd scons-2.1.0
#python setup.py install
這將會編譯SCons,安裝scons腳本到python目錄(/usr/local/bin或C:\Python25\Scripts),同時會安裝SCons編譯引擎到python使用的庫目錄(/usr/local/lib/scons或C:\Python25\scons)。因為這些都是系統目錄,你可能需要root或管理員許可權去安裝SCons。
3.1、編譯和安裝多個版本的SCons
SCons的setup.py腳本有一些擴展,這些擴展支持安裝多個版本的SCons到不同的位置。這讓下載和體驗不同版本的SCons變得很容易。
安裝SCons到指定版本的位置,調用setup.py的時候增加--version-lib選項:
#python setup.py install --version-lib
這將會安裝SCons編譯引擎到/usr/lib/scons-2.1.0或C:\Python25\scons-2.1.0目錄。
3.2、安裝SCons到其他的位置
你可以安裝SCons到其他的位置,而不是默認的位置,指定--prefix=選項:
#python setup.py install --prefix=/opt/scons
這將會安裝scons腳本到/opt/scons/bin,安裝編譯引擎到/opt/scons/lib/scons。
你可以同時指定--prefix和--version-lib,這個時候setup.py將會安裝編譯引擎到相對於指定prefix的特定版本的目錄,在剛才的例子上加上--version-lib,將會安裝編譯引擎到/opt/scons/lib/scons-2.1.0。
3.3、沒有管理員許可權的情況下編譯和安裝SCons
如果你沒有許可權安裝SCons到系統目錄,使用--prefix選項安裝到你選擇的其他的位置。例如,安裝SCons到相對於用戶$HOME目錄的合適的位置,scons腳本安裝到$HOME/bin,編譯引擎安裝到$HOME/lib/scons,使用如下命令:
#python setup.py install --prefix=$HOME
Ⅷ scons 怎麼忽視某個.c文件
介紹,scons用的是python語法。需要安裝python和scons後才能運行,能夠跨平台。比較automake自動生成makefile文件,scons可以認為直接是make的功能,因為只需要執行scons命令就等於執行了make的功能。
現在有一個hello.c的文件。
新建一個SConstruct文件,是一個python腳本文件。
Program('hello.c') 編譯hello.c並生成.o文件和可執行文件
Object('hello.c') 編譯hello.c但只生成生成.o文件
這兩個方法都是python的method。
如果想執行clean操作,我們不需要再象makefile那樣指名make clean語句,而是直接執行scons -c 或者scons -clean就可以。程序會根據SConstruct文件內容自動清除。
SConstruct的讀取和執行順序是彼此獨立的,直接看以下例子。
SConstruct文件內容:
print "Calling Program('hello.c')"
Program('hello.c')
print "Calling Program('goodbye.c')"
Program('goodbye.c')
print "Finished calling Program()"
Ⅸ 寫C++程序,除了用VC++6.0 2008等版本,還有那些比較好用的軟體
Windows下C++的IDE還是很多的,以下列舉8中比較流行的:
1。VC++(就是微軟的那一套,包括VC++6.0、VS2008/2010)
2。MinGW
評論:MinGW Studio,這個工具不錯;但可惜的是編譯任何文件,必須要建立工程; 但由於MinGW的不斷更新;這個工具的編譯器,MinGW可以隨時更新;應該不錯; 而且免費工具:)
3。CFree
評論:CFree,目前是收費的;雖然有破解的;但始終不好; EDU版本,沒限制.網上可以搜索到E版本下載;
雖然CFree支持多編譯器配置.包括VC,BCC,GCC,MinGW等,但對於VC好像存在問題; 一般功能可以用;
優勢:比較小巧;
4。LCC-Win32
評論:沒怎麼用過;聽說是將配置信息保存再 注冊表內;感覺不好;
5。TC
評論:老牌的TC編譯器; 好像不能滿足目前比較新的趨勢;;
6。Borland C/C++ Compiler
評論:對C++標准支持較好;
7。DEV C++
評論:對C++標准支持不錯;但 啟動起來比較慢; 沒有MinGwStudio 或者 CFree小巧; 開源,免費的;支持;
8。ColdBlocks
評論:強大的IDE, 支持各種類型編譯器,不僅包括C/C++,也包括其他多種類型語言;強大的IDE.不錯; 支持;好像也是免費;:)
———————————————————————————————————
Linux下的C\C++的IDE也不少,以下列舉6種:
1. VIM/make/gdb/valgrind/profiler
開始之前不得不提一下,最淳樸的工具鏈。雖然開始時花的時間多,但是覺得是值得的。
Vim 編輯器的神之美稱,make/scons/cmake 的編譯工具,gdb/ddd 的調視工具。(ddd界面太土,而且不太穩定)
這組工具自己可以定製,發現時間越長,這個工具還是效率不低的。
關鍵明白後面的概念,後面的IDE都是對其整合,比如都集成gdb,但是肯定沒有gdb本身暴露的功能強大。
2. Code-lite
是見到的IDE的跟VS 最接近的,很直觀,拿來就可以用。速度快,語法高亮不錯。
3. CodeBlocks
也不錯,但直觀型沒有Code-lite。
4. QtCreator
可以,但是界面不直觀。速度慢。
5. ecllips-cdt
重量級別,但是剛開始給人的感覺很是不直觀。但是用起來剛開始導文件建立索引時間大點,還是不錯的。
6. Kdevelop
Ubuntu 上不支持,需要手工下載,編譯花很長時間。 而且 那個安裝文檔沒有說清楚,需要安裝一個kdebase-workspace-dev。
Ⅹ 如何將scons工具集成到python中
在Windows或者Linux下,SConstruct文件相當於MakeFile,使用SCONS編譯,需輸入scons.bat(scons),後面帶上編譯選項options(如SConstruct所在的路徑)。觀察scons.bat這個腳本,可以在其他Python代碼中,將SCONS工具當作一個函數來調用。這個函數就是Scons.Script.main(),這個main函數將解析命令行中的編譯選項,通過sys.argv[1:]來傳入。所以只需修改這個函數,就可以以函數的方式調用,不需要通過如Popen等方式在代碼中啟動scons。
先找到SCONS安裝的目錄,如C:\\Python27\Scons-2.3.1包,將Scons\Script\Main.py中main()函數聲明中,添加一個傳入參數,變為:
def main(args_):
同時將_exec_main(Parser,Values)聲明,也變為:
__exec_main(args_,Parser,Values)
然後main(args_)通過調用__exec_main(args_,Parser,Values),將參數傳給__exec_main,在__exec_main中再將sys.argv[1:]替換為args.split().
修改完Main.py之後,執行如下,實現替換二進制源文件(Main.pyc):
>>import py_compile
>>py_compile(r『C:\\Python27\\Scons-2.3.1\\Scons\\Script\\Main.py『)
使用如下代碼測試:
>>import os
>>import sys
>>sys.path=[os.path.join(sys.prefix,『Scons-2.3.1『)]+sys.path
>>import Scons.Script
>>Scons.Script.main(『.『)
Scons工具正常使用。