青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

馭風萬里無垠

cmake的一些小經驗

初用CMake或者對其了解不太深的人,可能經常會被路徑包含、庫搜索路徑、鏈接路徑、RPath這些問題所絆倒,因為這些東西在手工執行gcc或者編寫makefile的時候是很輕而易舉的任務。

其實我當初也有不少疑惑,不過通過較長時間的實踐和閱讀manual,總算有了個相對很清晰的認識。

  • 如何使用其manual

cmake的幫助組織的還是很有規律的,了解了其規律,找自己想要的東西就會很簡單,所以個人覺得這一點可能是最重要的。其help系統大概是這么幾類:

    • command

這個是實用過程中最長用到的,相當于一般腳步語言中的基本語法,包括定義變量,foreach,string,if,builtin command都在這里。

可以用如下這些命令獲取幫助:

cmake --help-commands

這個命令將給出所有cmake內置的命令的詳細幫助,一般不知道自己要找什么或者想隨機翻翻得時候,可以用這個。

我一般更常用的方法是將其重定向到less里邊,然后在編輯器里邊搜索關鍵字。

 

另外也可以用如下的辦法層層縮小搜索范圍:

cmake --help-command-list

cmake --help-command-list | grep find

skyscribe@skyscribe:~/program/ltesim/bld$ cmake --help-command-list | grep find
find_file
find_library
find_package
find_path
find_program

cmake --help-command find_library

cmake version 2.6-patch 4
------------------------------------------------------------------------------
SingleItem

  find_library
       Find a library.

          find_library(<VAR> name1 [path1 path2 ...])

       This is the short-hand signature for the command that is sufficient in
       many cases.  It is the same as find_library(<VAR> name1 [PATHS path1
       path2 ...])

          find_library(
                    <VAR>
                    name | NAMES name1 [name2 ...]
                    [HINTS path1 [path2 ... ENV var]]
                    [PATHS path1 [path2 ... ENV var]]
                    [PATH_SUFFIXES suffix1 [suffix2 ...]]
                    [DOC "cache documentation string"]
                    [NO_DEFAULT_PATH]
                    [NO_CMAKE_ENVIRONMENT_PATH]
                    [NO_CMAKE_PATH]
                    [NO_SYSTEM_ENVIRONMENT_PATH]
                    [NO_CMAKE_SYSTEM_PATH]
                    [CMAKE_FIND_ROOT_PATH_BOTH |
                     ONLY_CMAKE_FIND_ROOT_PATH |
                     NO_CMAKE_FIND_ROOT_PATH]
                   )

    • variable

和command的幫助比較類似,只不過這里可以查找cmake自己定義了那些變量你可以直接使用,譬如OSName,是否是Windows,Unix等。

我最常用的一個例子:

cmake --help-variable-list  | grep CMAKE | grep HOST
CMAKE_HOST_APPLE
CMAKE_HOST_SYSTEM
CMAKE_HOST_SYSTEM_NAME
CMAKE_HOST_SYSTEM_PROCESSOR
CMAKE_HOST_SYSTEM_VERSION
CMAKE_HOST_UNIX
CMAKE_HOST_WIN32

這里查找所有CMake自己定義的builtin變量;一般和系統平臺相關。

如果希望將所有生成的可執行文件、庫放在同一的目錄下,可以如此做:

這里的target_dir是一個實現設置好的絕對路徑。(CMake里邊絕對路徑比相對路徑更少出問題,如果可能盡量用絕對路徑)

# Targets directory
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${target_dir}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${target_dir}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${target_dir}/bin)
    • property

Property一般很少需要直接改動,除非你想修改一些默認的行為,譬如修改生成的動態庫文件的soname等。

譬如需要在同一個目錄下既生成動態庫,也生成靜態庫,那么默認的情況下,cmake根據你提供的target名字自動生成類似的libtarget.so, libtarget.a,但是同一個project只能同時有一個,因為target必須唯一。

這時候,就可以通過修改taget對應的文件名,從而達到既生成動態庫也產生靜態庫的目的。

譬如:

cmake --help-property-list | grep NAME
GENERATOR_FILE_NAME
IMPORTED_SONAME
IMPORTED_SONAME_<CONFIG>
INSTALL_NAME_DIR
OUTPUT_NAME
VS_SCC_PROJECTNAME
skyscribe@skyscribe:~$ cmake --help-property OUTPUT_NAME
cmake version 2.6-patch 4
------------------------------------------------------------------------------
SingleItem
  OUTPUT_NAME
       Sets the real name of a target when it is built.
       Sets the real name of a target when it is built and can be used to
       help create two targets of the same name even though CMake requires
       unique logical target names.  There is also a <CONFIG>_OUTPUT_NAME
       that can set the output name on a per-configuration basis.
    • module

用于查找常用的模塊,譬如boost,bzip2, python等。通過簡單的include命令包含預定義的模塊,就可以得到一些模塊執行后定義好的變量,非常方便。

譬如常用的boost庫,可以通過如下方式:

# Find boost 1.40
INCLUDE(FindBoost)
find_package(Boost 1.40.0 COMPONENTS thread unit_test_framework)
if(NOT Boost_FOUND)
    message(STATUS "BOOST not found, test will not succeed!")
endif()
一般開頭部分的解釋都相當有用,可滿足80%需求:
cmake --help-module FindBoost | head -40
cmake version 2.6-patch 4
------------------------------------------------------------------------------
SingleItem
  FindBoost
       Try to find Boost include dirs and libraries
       Usage of this module as follows:
       == Using Header-Only libraries from within Boost: ==
          find_package( Boost 1.36.0 )
          if(Boost_FOUND)
             include_directories(${Boost_INCLUDE_DIRS})
             add_executable(foo foo.cc)
          endif()
       
       
       == Using actual libraries from within Boost: ==
          set(Boost_USE_STATIC_LIBS   ON)
          set(Boost_USE_MULTITHREADED ON)
          find_package( Boost 1.36.0 COMPONENTS date_time filesystem system ... )
       
          if(Boost_FOUND)
             include_directories(${Boost_INCLUDE_DIRS})
             add_executable(foo foo.cc)
             target_link_libraries(foo ${Boost_LIBRARIES})
          endif()
       
       
       The components list needs to contain actual names of boost libraries
  • 如何根據其生成的中間文件查看一些關鍵信息

CMake相比較于autotools的一個優勢就在于其生成的中間文件組織的很有序,并且清晰易懂,不像autotools會生成天書一樣的龐然大物(10000+的不鮮見)。

一般CMake對應的Makefile都是有層級結構的,并且會根據你的CMakeLists.txt間的相對結構在binary directory里邊生成相應的目錄結構。

譬如對于某一個target,一般binary tree下可以找到一個文件夾:  CMakeFiles/<targentName>.dir/,比如:

skyscribe@skyscribe:~/program/ltesim/bld/dev/simcluster/CMakeFiles/SIMCLUSTER.dir$ ls -l
total 84
-rw-r--r-- 1 skyscribe skyscribe 52533 2009-12-12 12:20 build.make
-rw-r--r-- 1 skyscribe skyscribe  1190 2009-12-12 12:20 cmake_clean.cmake
-rw-r--r-- 1 skyscribe skyscribe  4519 2009-12-12 12:20 DependInfo.cmake
-rw-r--r-- 1 skyscribe skyscribe    94 2009-12-12 12:20 depend.make
-rw-r--r-- 1 skyscribe skyscribe   573 2009-12-12 12:20 flags.make
-rw-r--r-- 1 skyscribe skyscribe  1310 2009-12-12 12:20 link.txt
-rw-r--r-- 1 skyscribe skyscribe   406 2009-12-12 12:20 progress.make
drwxr-xr-x 2 skyscribe skyscribe  4096 2009-12-12 12:20 src
這里,每一個文件都是個很短小的文本文件,內容相當清晰明了。build.make一般包含中間生成文件的依賴規則,DependInfo.cmake一般包含源代碼文件自身的依賴規則。
比較重要的是flags.make和link.txt,前者一般包含了類似于GCC的-I的相關信息,如搜索路徑,宏定義等;后者則包含了最終生成target時候的linkage信息,庫搜索路徑等。
這些信息在出現問題的時候是個很好的輔助調試手段。
  • 文件查找、路徑相關
    • include

一般常用的是:

include_directories()用于添加頭文件的包含搜索路徑
cmake --help-command include_directories
cmake version 2.6-patch 4
------------------------------------------------------------------------------
SingleItem
  include_directories
       Add include directories to the build.
         include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
       Add the given directories to those searched by the compiler for
       include files.  By default the directories are appended onto the
       current list of directories.  This default behavior can be changed by
       setting CMAKE_include_directories_BEFORE to ON.  By using BEFORE or
       AFTER you can select between appending and prepending, independent
       from the default.  If the SYSTEM option is given the compiler will be
       told that the directories are meant as system include directories on
       some platforms.
link_directories()用于添加查找庫文件的搜索路徑
cmake --help-command link_directories
cmake version 2.6-patch 4
------------------------------------------------------------------------------
SingleItem
  link_directories
       Specify directories in which the linker will look for libraries.
         link_directories(directory1 directory2 ...)
       Specify the paths in which the linker should search for libraries.
       The command will apply only to targets created after it is called.
       For historical reasons, relative paths given to this command are
       passed to the linker unchanged (unlike many CMake commands which
       interpret them relative to the current source directory).
    • library search

一般外部庫的link方式可以通過兩種方法來做,一種是顯示添加路徑,采用link_directories(), 一種是通過find_library()去查找對應的庫的絕對路徑。

后一種方法是更好的,因為它可以減少不少潛在的沖突。

        一般find_library會根據一些默認規則來搜索文件,如果找到,將會set傳入的第一個變量參數、否則,對應的參數不被定義,并且有一個xxx-NOTFOUND被定義;可以通過這種方式來調試庫搜索是否成功。

        對于庫文件的名字而言,動態庫搜索的時候會自動搜索libxxx.so (xxx.dll),靜態庫則是libxxx.a(xxx.lib),對于動態庫和靜態庫混用的情況,可能會出現一些混亂,需要格外小心;一般盡量做匹配連接。

    • rpath

所謂的rpath是和動態庫的加載運行相關的。我一般采用如下的方式取代默認添加的rpath:

# RPATH and library search setting
SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/nesim/lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 

 

posted on 2009-12-14 20:39 skyscribe 閱讀(29189) 評論(1)  編輯 收藏 引用

評論

# re: cmake的一些小經驗 2014-09-17 09:58 雷鋒

我研究了好幾天了,老是找不到包含文件  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

導航

統計

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久国产精品网站| 乱码第一页成人| 国产精品久久久久久久久借妻| 亚洲国产精品第一区二区三区| 免费观看久久久4p| 久久精品最新地址| 136国产福利精品导航| 欧美激情91| 欧美日韩高清在线| 亚洲一区二区三区三| 亚洲自拍电影| 精品999成人| 亚洲日本久久| 欧美午夜一区二区| 久久精品最新地址| 久久夜色精品国产亚洲aⅴ| 亚洲精品久久久久久久久久久久久| 亚洲黄色一区| 国产精品日韩久久久久| 久久美女艺术照精彩视频福利播放| 免费不卡视频| 亚洲欧美激情诱惑| 久久精品在线视频| 亚洲精品一二三| 亚洲视频专区在线| 欲香欲色天天天综合和网| 亚洲国产欧美在线| 国产欧美日韩麻豆91| 欧美高清在线视频观看不卡| 欧美三区在线视频| 久久久久久久999精品视频| 欧美 日韩 国产在线| 亚洲少妇自拍| 99成人免费视频| 亚洲专区欧美专区| 一级日韩一区在线观看| 亚洲午夜一二三区视频| 亚洲大胆视频| 午夜亚洲影视| 99热这里只有精品8| 午夜精品久久一牛影视| 亚洲最新在线视频| 久久综合久久综合这里只有精品 | 欧美日韩精品一区二区三区四区| 久久国内精品自在自线400部| 欧美二区在线观看| 久久婷婷国产综合国色天香| 欧美三级电影网| 免费视频一区二区三区在线观看| 国产精品啊啊啊| 亚洲全部视频| 亚洲激情国产精品| 亚洲欧美日韩国产成人| 中文亚洲字幕| 欧美精品1区2区| 欧美大片va欧美在线播放| 国产日韩欧美二区| 亚洲视频在线一区观看| 亚洲深夜福利| 欧美久色视频| 亚洲美女黄网| 一本色道久久综合一区| 欧美国产日韩视频| 欧美激情视频免费观看| 伊人久久大香线| 久久精品国产久精国产爱| 欧美一区国产在线| 国产九九精品| 久久国产99| 久久在线视频| 亚洲丶国产丶欧美一区二区三区| 欧美制服丝袜第一页| 久久久999成人| 黄色免费成人| 久久亚洲国产成人| 欧美成人性生活| 亚洲日本无吗高清不卡| 欧美激情一区二区三区| 亚洲精品久久视频| 一本色道久久综合狠狠躁篇的优点| 欧美人与禽猛交乱配视频| 亚洲人成网站在线播| 亚洲少妇诱惑| 国产精品综合av一区二区国产馆| 欧美亚洲一区三区| 美女尤物久久精品| 一色屋精品视频免费看| 巨乳诱惑日韩免费av| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲免费大片| 国产精品ⅴa在线观看h| 亚洲欧美激情精品一区二区| 久久久伊人欧美| 亚洲二区在线视频| 欧美日本一道本在线视频| 在线综合亚洲欧美在线视频| 欧美一区二区三区男人的天堂 | 欧美午夜一区二区福利视频| 午夜精品亚洲一区二区三区嫩草| 久久综合给合久久狠狠狠97色69| 亚洲日本黄色| 国产精品腿扒开做爽爽爽挤奶网站| 久久av二区| 亚洲美女在线视频| 久久久综合精品| 日韩亚洲精品电影| 国产情人综合久久777777| 麻豆九一精品爱看视频在线观看免费| 亚洲精品久久久久久久久| 欧美中文在线观看| 日韩视频免费| 国内精品视频在线播放| 欧美激情成人在线视频| 香蕉久久夜色精品| 91久久精品久久国产性色也91| 性欧美暴力猛交69hd| 亚洲国产小视频| 国产日韩精品一区二区| 欧美激情视频一区二区三区免费| 亚洲女ⅴideoshd黑人| 亚洲国产成人tv| 久久久久免费| 午夜精品一区二区三区在线视| 亚洲精品男同| 在线日韩中文字幕| 国产欧美综合在线| 国产精品户外野外| 欧美精品免费视频| 久久久久久久久久码影片| 亚洲一区二区精品在线观看| 亚洲国产精品久久91精品| 久久天天综合| 久久人人看视频| 久久精品日产第一区二区| 亚洲视频你懂的| 99热这里只有精品8| 亚洲激情国产| 亚洲人成在线播放| 亚洲国产精品99久久久久久久久| 韩日精品在线| 国产亚洲一区在线| 国产美女一区二区| 国产精品免费一区二区三区观看| 欧美日韩播放| 欧美色区777第一页| 欧美日韩日本视频| 欧美成人免费全部观看天天性色| 免费一区二区三区| 你懂的一区二区| 欧美激情在线观看| 欧美韩日一区二区三区| 欧美精品aa| 欧美色欧美亚洲另类二区| 欧美日韩国产首页在线观看| 欧美日韩高清不卡| 欧美日韩一级视频| 国产精品蜜臀在线观看| 国产精品一国产精品k频道56| 国产精品欧美一区二区三区奶水| 国产精品一区二区三区久久久| 国产农村妇女精品一二区| 国产日韩欧美在线看| 黄色影院成人| 亚洲精品欧美| 亚洲免费视频在线观看| 久久成人精品视频| 蜜桃精品久久久久久久免费影院| 欧美国产日韩精品免费观看| 亚洲国产毛片完整版| 99热这里只有成人精品国产| 亚洲视频在线观看| 久久国产精品72免费观看| 久久综合伊人| 欧美亚州在线观看| 国产一区二区欧美日韩| 亚洲国产视频一区二区| 亚洲午夜电影| 久久免费午夜影院| 亚洲国产中文字幕在线观看| 一区二区欧美国产| 欧美亚洲综合另类| 欧美搞黄网站| 国产一区二区三区在线播放免费观看 | 亚洲精品久久| 欧美在线免费| 欧美日韩国产综合久久| 国产亚洲精品v| 亚洲乱码国产乱码精品精可以看 | 曰韩精品一区二区| 亚洲最新视频在线| 久久夜色精品国产欧美乱极品| 亚洲精品国产精品国自产在线| 亚洲欧美另类在线观看| 欧美aa在线视频| 国内精品久久久久久久果冻传媒 | 伊人久久大香线蕉综合热线 | 91久久精品国产91性色tv| 亚洲欧美国产精品桃花| 欧美成人亚洲| 欧美一区二区女人|