回覆列表
  • 1 # 使用者6891426602阿366

    cmake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project檔案,能測試編譯器所支援的c++特性。只是cmake的組態檔取名為cmakelists.txt。cmake並不直接建構出最終的軟體,而是產生標準的建構檔(如linux的makefile或windowsvisualc++的projects/workspaces),然後再依一般的建構方式使用。

    在linux平臺下使用cmake生成makefile並編譯的流程如下:

    編寫cmakelists.txt。

    執行命令“cmakepath”或者“ccmakepath”生成makefile(path是cmakelists.txt所在的目錄)。

    使用make命令進行編譯

    工程例項:

    一.編寫各層cmakelists.txt

    主目錄的主程式main.cpp

    #include"hello.h"

    externhellohello;

    intmain()

    {

    hello.print();

    return0;

    }

    主目錄的cmakelists.txt

    #totherootbinarydirectoryoftheprojectas${main_binary_dir}.

    project(main)

    #versionsupport

    cmake_minimum_required(version2.8)

    #recurseintothe"hello"and"demo"subdirectories.thisdoesnotactually

    #causeanothercmakeexecutabletorun.thesameprocesswillwalkthrough

    #theproject"sentiredirectorystructure.

    add_subdirectory(hello)

    add_subdirectory(demo)

    #makesurethecompilercanfindincludefilesfromourhellolibrary.

    include_directories(${main_source_dir}/hello)

    #makesurethelinkercanfindthehellodemolibraryonceitisbuilt.

    link_directories(${hello_binary_dir}/hello)

    link_directories(${hello_binary_dir}/demo)

    #definethesourcecoedesofcurrentdirectoryasdir_srcs

    aux_source_directory(.dir_srcs)

    #addexecutablecalled"main"thatisbuiltfromthesourcefiles

    add_executable(main${dir_srcs})

    #linktheexecutabletothehellodemolibrary.

    target_link_libraries(mainhellodemo)

    定義專案名project(main),使得當前目錄可以用${main_source_dir},由於有2個子目錄,所以需要add_subdirectory它們。由於主程式會使用到其他庫,因而也需要指定連線庫所在目錄。

    主目錄下的作用是利用add_executable將當前目錄下的原始檔編譯成main程式,然後透過target_link_libraries連結hello和demo庫。由於主程式檔案使用了hello.h檔案,所以要include_directories該目錄。

    ---------------------------------------------------------------------------------------------------

    子目錄demo的子程式demo.c

    #include"hello.h"

    hellohello;

    子目錄demo的cmakelists.txt

    #makesurethecompilercanfindincludefilesfromourhellolibrary.

    include_directories(${main_source_dir}/hello)

    #definethesourcecoedesofcurrentdirectoryasdir_demo_srcs

    aux_source_directory(.dir_demo_srcs)

    #addlibrarycalled"demo"thatisbuiltfromthesourcefiles

    add_library(demo${dir_demo_srcs})

    demo目錄下的cmakelists主要作用是利用add_library將當前目錄原始碼編譯成demo庫,由於該庫使用到hello.h檔案,所以要include_directories該目錄。

    ---------------------------------------------------------------------------------------------------

    子目錄hello的子程式hello.h

    #ifndef_hello_h

    #define_hello_h

    classhello

    {

    public:

    voidprint();

    };

    #endif

    子目錄hello的子程式hello.c

    #include"hello.h"

    #include

    voidhello::print()

    {

    printf("hello,world!\n");

    }

    子目錄hello的cmakelists.txt

    #definethesourcecoedesofcurrentdirectoryasdir_hello_srcs

    aux_source_directory(.dir_hello_srcs)

    #addlibrarycalled"hello"thatisbuiltfromthesourcefiles

    add_library(hello${dir_hello_srcs})

    hello目錄下的cmakelists主要作用是利用add_library將當前目錄原始碼編譯成hello庫。

    ---------------------------------------------------------------------------------------------------

    二.執行cmake命令

    至此我們完成了專案中所有cmakelists.txt檔案的編寫,進入目錄step2中依次執行命令

    #cmake.

    預設當前目錄,生產makefile

    #make

    最後編譯程式

  • 中秋節和大豐收的關聯?
  • 莫姓的由來?