1. 靜態編譯和動態編譯有何不同
靜態編譯與動態編譯的區別:
1、動態編譯的可執行文件需要附帶一個的動態鏈接庫,在執行時,需要調用其對應動態鏈接庫中的命令。
所以其優點一方面是縮小了執行文件本身的體積,另一方面是加快了編譯速度,節省了系統資源。
缺點一是哪怕是很簡單的程序,只用到了鏈接庫中的一兩條命令,也需要附帶一個相對龐大的鏈接庫;二是如果其他計算機上沒有安裝對應的運行庫,則用動態編譯的可執行文件就不能運行。
2、靜態編譯就是編譯器在編譯可執行文件的時候,將可執行文件需要調用的對應動態鏈接庫(.so)中的部分提取出來,鏈接到可執行文件中去,使可執行文件在運行的時候不依賴於動態鏈接庫。所以其優缺點與動態編譯的可執行文件正好互補。
2. 如何用Visual Studio 2010編譯boost1.42庫
1.啟動Visual Studio 2010命令行提示
2.進入boost1.42根目錄,進入其子目錄\tools\jam\src
3.輸入命令build vc10
根據不同編譯器可輸入如下:
>>BCC5.5/BCB6/BCB2006/CB2009用戶輸入build borland
>>VC用戶依據其版本輸入build vc7或vc8或vc9或vc10
>>Mingw用戶輸入build mingw
4.將生成的bjam.exe拷貝到boost根目錄
5. 將命令行回退到boost根目錄,輸入如上命令
bjam --toolset=msvc stage
注:--toolset=borland(對應BCB)
=msvc(對應VC)
=gcc(對應Mingw)
bjam參數
--build-dir=<builddir>
編譯的臨時文件會放在builddir里(這樣比較好管理,編譯完就可以把它刪除了)
--stagedir=<stagedir>
存放編譯後庫文件的路徑,默認是stage
--build-type=complete
編譯所有版本,否則只會編譯一小部分版本(確切地說是相當於:variant=release, threading=multi;link=shared|static;runtime-link=shared)
variant=debug|release
決定編譯什麼版本(Debug or Release?)
link=static|shared
決定使用靜態庫還是動態庫。
threading=single|multi
決定使用單線程還是多線程庫。
runtime-link=static|shared
決定是靜態還是動態鏈接C/C++標准庫。
--with-<library>
只編譯指定的庫,如輸入--with-regex就只編譯regex庫了。
--show-libraries
顯示需要編譯的庫名稱
6.若要用到python庫且有多個python版本時添加如下命令參數,路徑視情況自定:
"-sPYTHON_ROOT=D:\Python" "-sPYTHON_VERSION=2.6"
3. 如何在VS2010中運行編譯C和C++
VS2010需要先新建工程項目,接著在源文件中添加cpp文件,然後再編寫代碼,最後編譯運行就可以,下面是創建執行C++程序的步驟:
1、首先新建項目(文件-->新建-->項目)
4. 易語言動態編譯是什麼意思啊
最簡單的理解:
動態編譯是相對靜態編譯而言的。
靜態編譯是指,程序在沒有運行之前就已經編譯好的
動態編譯則是,程序在運行之前並沒有進行編譯,而是根據實際情況在運行過程中進行編譯
5. VC 中如何使用 BCB 編譯的庫文件
在 Visual C++ 或者 Visual Studio 中, 是無法直接使用 BCB 工程編譯產生的庫文件的. 究其原因, 是由於微軟 Visual C++ lib 文件格式與 BCB 工程的 lib 文件格式不同所導致. Lib 文件中存放的是動態鏈接庫的介面信息, 而不會含有任何函數的內部實現細節. 因此, 我們可以直接通過 Dll 文件來反向生成特定格式的 lib 文件, 以便在 VC 和 BCB 中交叉使用各個編譯的動態鏈接庫.
以 MTK 平台的多路下載工具 SP_MDT 為例, 演示在 VC++ 中直接使用 BCB 編譯的 lib 庫的問題及解決方案. 我們以 Eboot 為例, 源代碼目錄下關於 Eboot 的文件有以下幾個:
Eboot 頭文件定義, 路徑: SP_MDT_SRCEboot
Eboot lib 庫文件, 路徑: SP_MDT_SRCLib
Eboot 動態鏈接庫文件, 路徑: SP_MDT_SRCoutput
我們新建一個 VC++ MFC 工程, 將上述文件全部拷貝到 MFC 工程目錄下, 同時在對話框中實現如下代碼段:
#include "interface.h"ANDROID_DL_HANDLE_T handle;
Android_DL_Create(&handle);
此時, 編譯工程會報出如下錯誤:
error LNK2019: 無法解析的外部符號 _Android_DL_Create@4
該符號在函數 "public: void __thiscall CLibDemoDlg::OnBnClickedOk(void)" 中被引用
原因在於我們僅僅包含了相應函數的頭文件, 而並沒有導入任何的函數實現(如 cpp 源文件或者 lib 庫文件). 接下來, 我們嘗試直接在 VC++ 中使用 BCB 編譯生成的 lib 庫文件, 加入以下代碼:
#pragma comment(lib, "eboot.lib")
編譯時報出如下錯誤:
eboot.lib : warning LNK4003: 無效的庫格式; 已忽略庫
顯然, VC++ 並不能正確的識別 BCB 所生成的 lib 庫文件. 那麼如何解決這個問題呢? 一般來說有兩種方法:
動態載入 dll 動態鏈接庫
最直接的方法是, 既然有頭文件, 那麼就可以知道各個函數的定義, 而 dll 動態鏈接庫則會將這些公開的函數導出. 因此, 可以直接調用 LoadLibrary 載入動態鏈接庫, 並查找到相應的函數地址, 完成調用. 這種方法簡單粗暴, 其好處是寫出的源代碼無論是在 BCB 還是在 VC++ 平台都能夠通用. 但其缺點也很明顯, 需要改寫頭文件, 定義各種各樣的函數指針, 如果使用到的導出函數很多, 則工作量較大.
6. 動態鏈接,靜態鏈接 動態編譯,靜態編譯 動態鏈接庫,靜態鏈接庫 這些兩兩間的區別是什麼呢
有點兒亂……,分數少簡單扼要的說說吧。
————————————
首先,傳統的編譯,也就是靜態編譯是把 源文件 翻譯成目標文件,這個是一次性過程,也就是你所謂的靜態編譯。
後來的Java和.NET等語言,首先編譯成中間形式,然後運行過程中根據需要編譯成本地代碼(注意這個過程不是一次性的,下次運行重新編譯),這個就是JIT(即時編譯)技術,從即時編譯發展出了動態編譯技術
————————————
(傳統的)編譯完成後,像C/C++、Fortran、匯編等語言,可以把多個目標文件合並到一個庫文件中,這個就是靜態庫。比如常說的庫函數printf就是libc裡面的函數。
如果有了啟動函數(main),main裡面使用了printf,就可以通過靜態鏈接技術,從libc中提取出printf所在的文件加入到可執行文件中,如果printf還需要其它函數,就繼續搜索並加入列表,直到形成一個閉包。這個就是靜態鏈接。
可是靜態鏈接有個明顯的缺點,如果每個程序都需要printf,那麼printf這個函數的代碼就會同時存在在每個程序中,這樣也太佔地方了吧。所以發明了動態連接技術,其實有兩種形式。無論哪一種,都是首先記錄下需要調用printf這個函數以及所在的動態庫,等到運行的時候再載入動態庫,從動態庫中找到真正的printf去執行。
由於,動態鏈接技術需要一些額外的信息,傳統的靜態庫是不具備的,這些額外信息主要是重復載入和卸載時所需要的一些代碼,因此需要動態鏈接庫。