2014年11月25日 星期二

Qt Displaying Windows


        今天在 Youtube 上面看到 Qt 的教學,跟著上面的影片實作 Dialog,但是在編譯時卻發生如下錯誤訊息:

LNK2019: unresolved external symbol *public: __thiscall MyDialog::MyDialog(class QWidget*)* (??0MyDialog@@QAE@PAVQWidget@@@Z) referenced in function *private: void __thiscall MainWindow::showDialog(void)* (?showDialog@MainWindow@@AAEXXZ)

       查看了該影片的討論串,發現 marcel rosen 遇到與我相同的問題且已經有解法,解決上面的問題請依照下列步驟執行即可:

  1. Build -> Clean all
  2. Build -> Run qmake
  3. Build -> Rebuild All

2014年11月24日 星期一

如何在 Windows 中建立 softlink

     在 Linux 中你可以透過 "ln -s ..." 來建立 symbolic link;在 Windows 中你可以透過 mklink 來建立 symbolic link。注意:如果你透過滑鼠右鍵執行 "建立捷徑(S)" 會在檔名後面加上 .lnk,ˇ但是透過 mklink 來建立捷徑並不會產生 .lnk 這樣的副檔名。所以對於應用程式來講可以跟操作一般的目錄是一樣的效果。

     另外,執行 mklink 必須有管理者的權限,否則執行時會出現 "您沒有足夠的權限可執行此操作。" 所以請 "以系統管理員身分執行 ... cmd " 如下圖所示:



Microsoft Windows [版本 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\Josh>mklink
建立符號連結。

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      建立目錄符號連結。預設是檔案符號連結。
        /H      建立永久連結而不是符號連結。
        /J      建立目錄連接。
        Link    指定新符號連結名稱。
        Target  指定新連結參照的路徑 (相對或絕對)。

C:\Users\Josh>


[Keyword]

  • Windows command line softlink

[參考鏈結]

無法啟動程式,因為您的電腦遺失 QtWidgetsd.dll...

        今天嘗試寫一個簡單的 Qt 應用程式編譯完後,透過 Qt Creator 執行程式並沒有發生任何問題,但是直接執行 exe 檔卻發生 "無法啟動程式,因為您的電腦遺失 QtWidgetsd.dll..." 如下圖所示:

        這個問題就如你開發 MFC 程式發布應用程式時是用 Dynamical Link 而非 Static Link,但是 Qt 要編譯成 static link 需要的步驟比較複雜且有 licensing 的問題 (請參考: Making the right licensing decision )。

        所以在開發階段解決這個問題最快的方式是將  DLL 所在的目錄加入到系統路徑中,以我的例子就是將 "C:\Qt\5.3\msvc2013\bin" 加入到 PATH 中即可。

        另外如果你想要查詢該程式所相依的 DLL 檔案有哪些,可以使用 Dependency Walker 工具來查看,如下所示:


        除了將 Qt DLL 檔案所在的目錄加入到 PATH 外,你可以自己手動拷貝所需的 DLL 檔案與執行檔相同的目錄下,透過 Dependency Walker 工具我只查到與 Qt 相關的 DLL 檔案有 Qt5Widgetsd.dll、libGLESv2d.dll、Qt5Cored.dll、Qt5Guid.dll、icuin52.dll、icuuc52.dll、icudt52.dll;但是當執行時卻出現下列錯誤訊息應用程式就被強迫關閉。


      經過實驗最後發現必須額外放入 libEGLd.dll 檔案才可以正常執行應用程式。

[參考鏈結]

2014年11月17日 星期一

"no JDK found – please set JAVA_HOME" while starting tomcat7


Solution 1 to make sure default-java exists underneath /usr/lib/jvm/ folder,if no, you can do something as follow:

ln -s /usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java

Solution 2 Add JAVA_HOME variable into /etc/default/tomcat7 file to specific JDK for tomcat7

sudo gedit /etc/default/tomcat7

Added JAVA_HOME variable

JAVA_HOME=/usr/lib/jvm/java-7-oracle

Reference:

2014年11月4日 星期二

Installing the APR based Apache Tomcat Native library on Ubuntu 12.04

05-Nov-2014 13:38:52.881 INFO [main] org.apache.catalina.core.AprLifecycleListener.init The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
05-Nov-2014 13:38:52.962 WARNING [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:colorado-webapp' did not find a matching property.


sudo apt-get install libtcnative-1


Due to Tomcat 7.0.55 requires libtcnative-1 1.1.30, you will see follow error message after restart the Tomcat server.

05-Nov-2014 14:02:03.109 SEVERE [main] org.apache.catalina.core.AprLifecycleListener.init An incompatible version 1.1.22 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.30


You can upgrade it with:

$ sudo add-apt-repository ppa:pharmgkb/trusty
$ sudo apt-get update
$ sudo apt-get upgrade libtcnative-1

References:
Tomcat APR native library not loaded *even* when present and configured
Tomcat native library update
Installing the APR-based Tomcat Native Library for Jira on Debian 7 (Updated)
Apache Tomcat Native Library Doc

Other Topics:
Specify JDK for tomcat7

Download
Apache Tomcat Native library

2014年11月3日 星期一

How to know which servlet and jsp version

Server info: <%= application.getServerInfo() %>
  
Servlet version: <%= application.getMajorVersion() %>.<%= application.getMinorVersion() %>
  
JSP version: <%= JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion() %>
  
Java version: <%= System.getProperty("java.version") %>
  
Source from: how to know which servlet and jsp version