cef3編譯為xp版本
⑴ 如何利用CEF3創建一個簡單的應用程序
開始
首先,根據自身所使用的開發平台,可以去 這里 下載對應的發布版本。針對這個教程,我們需要下載1750或者更新的版本。當前支持的平台有Windows, linux和Mac OS X。每一個版本都包含了當在特定平台上編譯特定版本CEF3時所需要的所有文件和資源。您可以通過包含在里邊的 REDME.txt 文件或者在Wiki上GeneralUsage 中的 Getting Started,了解每個發布版本的具體內容和細節。
編譯發布版本中的項目
以CEF發布版本為基礎開發的應用程序可以使用標準的平台編譯工具進行編譯執行。包括 Windows 平台下的 Visual Studio, Mac OS X 平台下的 Xcode, 以及 Linux 平台下的 gcc/make。針對平台的不同,項目的編譯過程也有些許的不同和要求。
Windows
Windows 平台下編譯 Cefsimple 步驟:
1. 用對應的 Visual Studio 版本打開項目解決方案。舉個例子,如果你安裝的是 Visual Studio 2010, 那麼,打開的就是 cesimple2010.sln。
2. 如果你下載的是 x64版本,請確保你選擇的是 x64的開發平台。
3. 開始編譯。
4. 如果編譯通過,那麼,在當前解決方案的目錄下,將出現「out/Debug」(或者 「out/Release」)文件夾。
5. 執行文件夾下 cefsimple.exe, 確保能正確運行。
載入一個自定義URL
cefsimple項目中默認載入的URL是 google.com,當然,你也可以用自定義的 URL 去替代它,最方便的就是通過命令行搞定。
# Load the local file 「c:\example\example.html」
cefsimple.exe --url=file://c:/example/example.html
除了命令行的方法,也可以通過直接修改在 cefsimple/simple.cpp 文件中的代碼,達到你的目的。
# Load the local file 「c:\example\example.html」
…
if (url.empty())
url = file://c:/example/example.html;
應用程序組成
所有的 CEF 應用程序都有一下主要組成部分:
1. CEF 的動態鏈接庫 。(在 Windows 平台下就是 libcef.dll)
2. 支持庫。(ICU, FFMPEG等)
3. 資源。(html/js/css, strings等)
4. 客戶端執行文件。(本教程中就是 cefsimple.exe.)
要點(必看)
1. CEF 使用的是多進程。應用程序主進程是瀏覽器進程,而其他子進程是由 renderer, plugins, GPU等創建。
2. 在 Windows 和 Linux 平台下的執行文件可以被主進程和子進程使用。
3. CEF 中所有進程都可以是多線程的。CEF提供了許多功能和介面在不同的線程中傳遞任務。
4. 一些回調方法和函數只能在特定的進程或者線程中使用。在你第一次使用新的回調方法或者函數之前,請確保你已經閱讀了 API 頭文件中源碼,看使用要求。
流程分析
cefsimple 應用程序首先初始化CEF,然後創建了一個簡單的彈出瀏覽器窗口。當關閉了所有的瀏覽器窗口,應用程序就會結束。程序執行流程如下:
1. 系統執行入口點函數(main or wWinMain),並創建瀏覽器進程。
2. 入口點函數:
1. 創建能夠處理進程級別的回調方法的 SimpleApp 實例。
2. 初始化 CEF,進入 CEF 消息循環。
3. 初始化 CEF 之後,調用 SimpleApp::OnContextInitialized() 。這個方法中:
1. 創建單例的 SimpleHandler 。
2. 由 CefBrowserHost::CreateBrowsersync() 方法創建一個瀏覽器窗口。
4. 所有的瀏覽器共享 SimpleHandler 實例, 此實例能定製瀏覽器行為、處理瀏覽器相關回調方法(life span, loading state, title display等)。
5. 當一個瀏覽器窗口關閉的時候,調用 SimpleHandler::OnBeforeClose() 。當所有的瀏覽器窗口全部關閉時,OnBeforeClose() 函數就會執行跳出 CEF 消息循環的行為,退出應用程序。
入口點函數
程序的運行開始於瀏覽器進程中的入口點函數。這個函數會初始化 CEF 以及所有跟操作系統有關的對象。
Windows
#include <windows.h>
#include "cefsimple/simple_app.h"
#include "include/cef_sandbox_win.h"
// Set to 0 to disable sandbox support.
#define CEF_ENABLE_SANDBOX 1
#if CEF_ENABLE_SANDBOX
// The cef_sandbox.lib static library is currently built with VS2010. It may not
// link successfully with other VS versions.
#pragma comment(lib, "cef_sandbox.lib")
#endif
// Entry point function for all processes.
int APIENTRY wWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow) {
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
void* sandbox_info = NULL;
#if CEF_ENABLE_SANDBOX
// Manage the life span of the sandbox information object. This is necessary
// for sandbox support on Windows. See cef_sandbox_win.h for complete details.
CefScopedSandboxInfo scoped_sandbox;
sandbox_info = scoped_sandbox.sandbox_info();
#endif
// Provide CEF with command-line arguments.
CefMainArgs main_args(hInstance);
// SimpleApp implements application-level callbacks. It will create the first
// browser instance in OnContextInitialized() after CEF has initialized.
CefRefPtr<SimpleApp> app(new SimpleApp);
// CEF applications have multiple sub-processes (render, plugin, GPU, etc)
// that share the same executable. This function checks the command-line and,
// if this is a sub-process, executes the appropriate logic.
int exit_code = CefExecuteProcess(main_args, app.get(), sandbox_info);
if (exit_code >= 0) {
// The sub-process has completed so return here.
return exit_code;
}
// Specify CEF global settings here.
CefSettings settings;
#if !CEF_ENABLE_SANDBOX
settings.no_sandbox = true;
#endif
// Initialize CEF.
CefInitialize(main_args, settings, app.get(), sandbox_info);
// Run the CEF message loop. This will block until CefQuitMessageLoop() is
// called.
CefRunMessageLoop();
// Shut down CEF.
CefShutdown();
return 0;
}
SimpleApp
SimpleApp 負責處理進程級別的回調方法。它會曝露出一些在多進程中共享或者被特定進程使用的介面和方法。CefBrowserProcessHandler 介面,在瀏覽器進程中調用。還有一個被分離出 CefBrowserProcessHandler 介面(例子項目沒有展示)只會在渲染進程中被調用。由於 CefBrowserProcessHandler 不光實現了 CefApp, 同時還有 CefBrowserProcessHandler,所以它的返回值必須是[this]。
// simple_app.h
#include "include/cef_app.h"
class SimpleApp : public CefApp,
public CefBrowserProcessHandler {
public:
SimpleApp();
// CefApp methods:
virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler()
OVERRIDE { return this; }
// CefBrowserProcessHandler methods:
virtual void OnContextInitialized() OVERRIDE;
private:
// Include the default reference counting implementation.
IMPLEMENT_REFCOUNTING(SimpleApp);
};
// simple_app.cpp
#include "cefsimple/simple_app.h"
#include <string>
#include "cefsimple/simple_handler.h"
#include "cefsimple/util.h"
#include "include/cef_browser.h"
#include "include/cef_command_line.h"
SimpleApp::SimpleApp() {
}
void SimpleApp::OnContextInitialized() {
REQUIRE_UI_THREAD();
// Information used when creating the native window.
CefWindowInfo window_info;
#if defined(OS_WIN)
// On Windows we need to specify certain flags that will be passed to
// CreateWindowEx().
window_info.SetAsPopup(NULL, "cefsimple");
#endif
// SimpleHandler implements browser-level callbacks.
CefRefPtr<SimpleHandler> handler(new SimpleHandler());
// Specify CEF browser settings here.
CefBrowserSettings browser_settings;
std::string url;
// Check if a "--url=" value was provided via the command-line. If so, use
// that instead of the default URL.
CefRefPtr<CefCommandLine> command_line =
CefCommandLine::GetGlobalCommandLine();
url = command_line->GetSwitchValue("url");
if (url.empty())
url = "http://www.google.com";
// Create the first browser window.
CefBrowserHost::CreateBrowserSync(window_info, handler.get(), url,
browser_settings, NULL);
}
SimpleHandler
SimpleHandler 負責處理瀏覽器級別的回調方法。這些回調方法會在瀏覽器進程中執行。在這個項目中,針對所有的瀏覽器使用相同的 CefClient 實例,但是如果你願意,可以在自己的應用程序中使用不同的 CefClient實例的。
// simple_handler.h
#include "include/cef_client.h"
#include <list>
class SimpleHandler : public CefClient,
public CefDisplayHandler,
public CefLifeSpanHandler,
public CefLoadHandler {
public:
SimpleHandler();
~SimpleHandler();
// Provide access to the single global instance of this object.
static SimpleHandler* GetInstance();
// CefClient methods:
virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() OVERRIDE {
return this;
}
virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE {
return this;
}
virtual CefRefPtr<CefLoadHandler> GetLoadHandler() OVERRIDE {
return this;
}
// CefDisplayHandler methods:
virtual void OnTitleChange(CefRefPtr<CefBrowser> browser,
const CefString& title) OVERRIDE;
// CefLifeSpanHandler methods:
virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) OVERRIDE;
virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE;
// CefLoadHandler methods:
virtual void OnLoadError(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
ErrorCode errorCode,
const CefString& errorText,
const CefString& failedUrl) OVERRIDE;
// Request that all existing browser windows close.
void CloseAllBrowsers(bool force_close);
private:
// List of existing browser windows. Only accessed on the CEF UI thread.
typedef std::list<CefRefPtr<CefBrowser> > BrowserList;
BrowserList browser_list_;
// Include the default reference counting implementation.
IMPLEMENT_REFCOUNTING(SimpleHandler);
};
// simple_handler.cpp
#include "cefsimple/simple_handler.h"
#include <sstream>
#include <string>
#include "cefsimple/util.h"
#include "include/cef_app.h"
#include "include/cef_runnable.h"
namespace {
SimpleHandler* g_instance = NULL;
⑵ cefforxp.gzip 這個文件識別不到
如果在運行某軟體或編譯程序時提示缺少、找不到gzip.dll等類似提示,您可將從腳本之家下載來的gzip.dll拷貝到指定目錄即可(一般是system系統目錄或放到軟體同級目錄裡面),或者重新添加文件引用。
從網站下載下來文件之後,先將其解壓(一般都是rar壓縮包), 然後根據您系統的情況選擇X86/X64,X86為32位電腦,X64為64位電腦。默認都是支持32位系統的, 如果不知道是X86還是X64。打開"開始-運行-輸入regsvr32 gzip.dll",回車即可解決。
⑶ cef3在linux下怎麼編譯
我的操作系統是 debian sarge,其中已經有 mingw32 編譯器,只需安裝: apt-get install mingw32這會安裝好 mingw32 交叉編譯系統,用 i586-mingw32msvc-gcc 即可為 Windows 編譯程序。 在編譯 wxWidgets 的 Windows 版本之前,需要安裝 DirectX...
⑷ 如何編譯QT5.9,支持xp系統
很懸,需要改源碼裡面的介面,
5.9本身編譯參數裡面沒有
-target
xp,
其次是裡面用到了一些xp不支持的系統API,重點是用編譯器編譯的時候不會提醒你哪些介面不支持(即使設置了系統版本5.01,
編譯器支持xp),所以到時候編譯完的還要放到xp系統下驗證,
最難受的就是plugin相關的,
因為根本不會告訴你哪個介面沒有。
如果一定要的話,
還是使用5.6的
,
同樣是LTS的,
新的一些功能是沒法用了,但至少支持webEngine嘛
⑸ vs2012編寫的c#窗體程序在xp上跑不了,怎麼辦
微軟為了推銷自家平台,默認配置下VS2012和VS2013編寫的應用程序只能在Vista/Win7/Win8上運行。但幸好還保留了生成XP程序的設置項。XP和Win2003的用戶還是大量存在的,我們程序軟體的發布不能不考慮他們。
1.
項目菜單->項目屬性->配置屬性->常規->平台工具集,選擇「VS2013WindowsXP(v120_xp)」;
2. 項目菜單->項目屬性->配置屬性->常規->MFC的使用,選擇在靜態庫中使用MFC;
3.
項目菜單->項目屬性->鏈接器->系統->子系統->控制台或窗口windows(根據你的項目類型選擇),第二項版本號設成5.01。
4. C/C++->代碼生成->運行庫,選擇「多線程調試(/MTd)";
5. 還需要至少帶有Update3(或4),這一點我沒有驗證,因為我直接安裝的就是帶有Update3的VS2013。
以上就OK了。缺點仍然有,例如靜態編譯的EXE比正常動態要大不少,目前我尚未試出動態編譯後在XP中能運行的方法,--不過這個不要緊,因為VS2013版本如此之高,客戶的電腦上很難自帶配有它的運行庫,你即使動態編譯,發布軟體時也還是要帶上運行庫的,只不過在多個程序時只需帶一份運行庫罷了。
另外,我在實際大項目中用上述方法,仍有出錯現象發生。以後再研究吧。一般情況下上述方法就可以了。
在網上另外發現了這個貼子,說得很詳細,包括非IDE的命令行編譯,一起貼到下面:
問題一:編譯出來的exe在xp上面運行提示「不是有效的win32應用程序」
在vs2012/2013版本裡面,其自帶的c編譯器cl.exe,若直接使用cl
a.c編譯,那麼生成出來的exe放在vista及以上版本直接運行沒有問題,但是在xp上則會出來「不是有效的win32應用程序」的出錯提示。這是因為vs2012/2013自帶的c編譯器默認情況下生成的exe會默認只支持vista及以上版本的windows系統。
解決方法:
對於使用命令行cl.exe直接編譯的方式:
先用cl a.c編譯一遍,此時會生成a.exe和a.obj兩個文件,此時,再執行 link b.obj
/subsystem:console,5.01,它會鏈接一個新的a.exe出來,此時的exe就可以在xp上運行了。相比vs2010以及以前版本的編譯器編譯,會多第二步的link過程,後面的參數也很容易理解,subsystem,5.01,此處的5.01是指的windows內核版本號,5.01表示windows
2000 with sp1,即此exe可以在win2000 sp1及以上的windows中執行。
當然,這個地方的/subsystem後面有很多參數,上面給的console,5.01是指命令行程序,如果是有GUI即有窗口的程序,改成windows,5.01即可。!!注意!!此處的5.01一定不要想當然改成5.0就變成windows
2000
不帶sp1的版本,實際上,5.0並不被vs2013的編譯所承認,會報警告不認5.0,就會按照默認的不帶5.01的方式編譯,這樣就無法在vista以下的系統中運行生成的exe了。
對於在vs2013裡面使用新建項目的方式:
右擊相應的項目,選擇「屬性」,在項目屬性頁中的「配置屬性」下面的「常規」裡面,把「平台工具集」,由「Visual Studio 2013
(v120)」改成「Visual Studio 2013 - Windows XP
(v120_xp)」,確定之後,重新生成項目即可。當然這里按這樣修改的話,就只能在winxp及以上的版本系統裡面運行了。
問題二:用vs2010/2012/2013編譯出來的exe在未安裝vc++運行庫的機器上運行時提示」未找到MSVCR120D.DLL「從而無法運行
這是個老問題了,無非就是運行庫動態編譯和靜態編譯的問題了。dll動態載入的話有個好處,它可以減少生成的exe文件的體積,但是缺點就是如果對應的系統環境變數或者exe所在的目錄裡面找不到其所需要的dll文件的話,程序就會拒絕執行。而靜態編譯就是把所有需要的庫都靜態編譯到exe文件裡面,這樣就可以在所有的系統平台上都能運行,但它也有一個缺點,就是生成的exe文件因為已經帶了部分庫的代碼,所以體積會相對動態編譯出來的exe大(具體大多少要根據庫的內容才能確定)。
解決方法:
對於直接使用cl.exe和link.exe編譯連接的方式:
直接在cl.exe編譯的時候或者在makefile裡面把編譯參數加上/MT即可。
對於在vs2013裡面使用新建項目的方式:
右擊相應的項目,選擇「屬性」,在項目屬性頁中的「配置屬性」下面的「C/C++」下面的「代碼生成」一項,由默認的「多線程調試DLL
(/MDd)」,改成「多線程 (/MT)」,確定之後,重新生成項目即可。這樣所得的exe文件就是靜態編譯了。
⑹ c++程序在xp系統為何無法運行
不同的windows之間,有些東西是不兼容的,名字相同的東西內容有差異,動態鏈接庫不同。
win10 是 64位機,XP是32位。 Dev-C++ 編譯器 的適應性差於 MS VC++ 6.0。
---------
你試用 MS VC++ 編譯。注意,根據程序目標工作的操作系統類型,加上宏定義。
對於 Windows XP with Service Pack 3 (SP3) 加上宏定義:
#define WINVER 0x05010300
對於 Windows XP with Service Pack 2 (SP2) 加上宏定義:
#define WINVER 0x05010200
若要運行在 win10 上 加上宏定義:
#define WINVER 0x0A00
其它 windows 版本 要 用 相應的 宏。按版本,分別編譯出 .exe 文件。
這樣,就可解決 在先進的操作系統版本上 編譯出 可用於 老版本 上的可執行程序了。