Archive:Development/CMake FAQ (zh TW): Difference between revisions

From KDE TechBase
No edit summary
No edit summary
Line 30: Line 30:
</code>
</code>


As you can see genembed is also listed as a dependency, this means cmake knows that it has to build the executable genembed before executing this rule.
如你所見 genembed 也做為相賴關係列出。這表示 CMake 知道它應該在執行這些規則之前建構 genembed 執行檔。


=== 我不想設定 -DCMAKE_INSTALL_PREFIX 命令列參數。CMake 是否支援 KDEDIR 環境變數? ===
=== 我不想設定 -DCMAKE_INSTALL_PREFIX 命令列參數。CMake 是否支援 KDEDIR 環境變數? ===
No.  $KDEDIR is deprecated in KDE 4.
不。KDE 4 反對使用 $KDEDIR。


=== 為什麼我會得到/usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to `QString::fromLatin1_helper(char const*, int)'之類的編譯錯誤?===
=== 為什麼我會得到/usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to `QString::fromLatin1_helper(char const*, int)'之類的編譯錯誤?===
Line 39: Line 39:


=== 我要怎麼讓 CMake 創建 noisy makefiles?我希望看到 make 過程執行的指令。===
=== 我要怎麼讓 CMake 創建 noisy makefiles?我希望看到 make 過程執行的指令。===
Pass the VERBOSE variable to make, i.e.
 
傳遞 VERBOSE 變數給 make,例如:
<code>
<code>
% make VERBOSE=1
% make VERBOSE=1
</code>
</code>
or
<code>
<code>
% VERBOSE=1 make
% VERBOSE=1 make
</code>
</code>


For more details see the CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#Is_there_an_option_to_produce_more_.27verbose.27_compiling.3F Is there an option to produce more 'verbose' compiling?]
更多細節請查看 CMake wiki:[http://www.cmake.org/Wiki/CMake_FAQ#Is_there_an_option_to_produce_more_.27verbose.27_compiling.3F 有沒有選項可以產生更多的'verbose'編譯?]


=== 產生的 Makefiles 中沒有 'make distclean' 標籤。我該如何才能清理包括 cache 檔案在內的所有檔案? ===
=== 產生的 Makefiles 中沒有 'make distclean' 標籤。我該如何才能清理包括 cache 檔案在內的所有檔案? ===
Simply remove the build directory, or just the contents of the build directory.
 
只需刪除建構目錄,或建構目錄裡的內容。


=== I've got ''fatal error LNK1104: cannot open file 'optimized.lib' '' under Windows/msvc (release with debug info build)  ===
=== I've got ''fatal error LNK1104: cannot open file 'optimized.lib' '' under Windows/msvc (release with debug info build)  ===

Revision as of 12:40, 30 November 2009


Development/CMake FAQ

常見問題

These are KDE's FAQ for CMake, there is also a CMake FAQ in the main CMake wiki.

如何讓我最喜歡的編輯器支援 CMake 語法和縮排?

請閱讀CMake Wiki 的 CMake 編輯器支援章節。這裡說明如何設定 Emacs(XEmacs works too)、VIM、Kate、KWrite 和 KDevelop。

我需要在建構過程中產生一些檔案,我該怎麼做?

使用 ADD_CUSTOM_COMMAND()。在 CMake wiki 的如何在建構過程中生成原始碼檔案有解釋

我想在建構過程中建立一個稍後使用的可執行檔。我該怎麼做?

假設可執行檔叫 genembed。那麼使用 KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources})來建立可執行檔。RUN_UNINSTALLED 選項非常重要,因為可執行檔必須從建構目錄執行,並會連結到建構目錄中的一些函式庫。為了達成這個目的,可執行檔透過 RPATH 設定和 shell 腳本包裝編譯,和執行檔的名稱一樣只是多了個「.sh」。這個 shell 腳本建立 LD_LIBRARY_PATH 並呼叫實際的執行檔。

依照上面說明的在 ADD_CUSTOM_COMMAND() 中使用這個 shell 腳本包裝。 您可以通過查詢 WRAPPER_SCRIPT 來找到名稱和確切的路徑。這裡有一個來自 kdelibs/kstyles/keramik/ 的完整例子:

  1. build the executable

kde4_add_executable(genembed RUN_UNINSTALLED ${genembed_SRCS})

  1. get the name of the generated wrapper script (which sets up LD_LIBRARY_PATH)

get_target_property(GENEMBED_EXECUTABLE genembed WRAPPER_SCRIPT)

  1. and the custom command

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/keramikrc.h

 COMMAND ${GENEMBED_EXECUTABLE} --file ${CMAKE_CURRENT_BINARY_DIR}/keramikPics.txt > \
 ${CMAKE_CURRENT_BINARY_DIR}/pixmaps.keramik
 DEPENDS genembed ${keramikPics}

)

如你所見 genembed 也做為相賴關係列出。這表示 CMake 知道它應該在執行這些規則之前建構 genembed 執行檔。

我不想設定 -DCMAKE_INSTALL_PREFIX 命令列參數。CMake 是否支援 KDEDIR 環境變數?

不。KDE 4 反對使用 $KDEDIR。

為什麼我會得到/usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to `QString::fromLatin1_helper(char const*, int)'之類的編譯錯誤?

如果你有舊版的 Qt 4 在 qt/lib 目錄,你必須刪除這些舊版(4.0.1)檔案。

我要怎麼讓 CMake 創建 noisy makefiles?我希望看到 make 過程執行的指令。

傳遞 VERBOSE 變數給 make,例如: % make VERBOSE=1 % VERBOSE=1 make

更多細節請查看 CMake wiki:有沒有選項可以產生更多的'verbose'編譯?

產生的 Makefiles 中沒有 'make distclean' 標籤。我該如何才能清理包括 cache 檔案在內的所有檔案?

只需刪除建構目錄,或建構目錄裡的內容。

I've got fatal error LNK1104: cannot open file 'optimized.lib' under Windows/msvc (release with debug info build)

This is a problem with KDE's CMakeLists.txt and CMake 2.6.0 and 2.6.1, it will be fixed soon.

QT_*_LIBRARIES must not be used in your target_link_libraries() line of CMakeLists.txt. Use QT_*_LIBRARY instead. Otherwise the variable will look like this (example for QT_QTNETWORK_LIBRARY):

optimized;C:/kde4/lib/QtNetwork4.lib;debug;C:/kde4/lib/QtNetworkd4.lib ^^^^^^^^^

The first optimized part is translated by cmake to optimized.lib so we have got the cannot open file 'optimized.lib' error.