日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CMake使用入门

發(fā)布時(shí)間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CMake使用入门 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、開(kāi)胃菜

hello目錄下的文件結(jié)構(gòu):

├── CMakeLists.txt ├── hello.c ├── hello.h └── main.c

C代碼見(jiàn)下節(jié)。

最簡(jiǎn)單的cmake配置文件:

project(HELLO) set(SRC_LIST main.c hello.c) add_executable(hello ${SRC_LIST})

如果要編譯成gdb可調(diào)試的debug版本,則在配置文件中加入:

set(CMAKE_BUILD_TYPE Debug)

如果要編譯成可用gprof分析的版本,則在配置文件中加入:

set(CMAKE_BUILD_TYPE Profile) set(CMAKE_CXX_FLAGS_PROFILE "-pg")

最簡(jiǎn)單的編譯過(guò)程(在hello目錄中編譯):

cmake . make

這樣就會(huì)在hello目錄中生成可執(zhí)行文件hello和其他cmake相關(guān)的配置文件。

為了讓代碼整潔,可以使用所謂的out-of-source編譯方式:

mkdir build cd build cmake .. make

這樣編譯產(chǎn)生的所有文件都在build中了。

二、一個(gè)小工程hello示范

本例主要包含獨(dú)立庫(kù)文件、可執(zhí)行文件的編譯和安裝過(guò)程中涉及的相關(guān)問(wèn)題。

hello目錄中的文件結(jié)構(gòu):

├── CMakeLists.txt ├── libhello │?? ├── CMakeLists.txt │?? ├── hello.c │?? └── hello.h └── src├── CMakeLists.txt└── main.c

文件內(nèi)容如下:

project(HELLO) cmake_minimum_required(VERSION 2.8) set(CMAKE_INSTALL_PREFIX /tmp/hello) add_subdirectory(libhello) add_subdirectory(src)

set(CMAKE_INSTALL_PREFIX:設(shè)置程序的安裝目錄,優(yōu)先級(jí)比cmake命令參數(shù)設(shè)置高。

set(LIB_SRC hello.c) add_definitions("-DLIBHELLO_BUILD") set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) add_library(libhello SHARED ${LIB_SRC}) add_library(hello_static STATIC ${LIB_SRC}) install(TARGETS libhello LIBRARY DESTINATION lib) install(TARGETS hello_static ARCHIVE DESTINATION lib) install(FILES hello.h DESTINATION include) set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello") set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")

(1)add_library:生成庫(kù)文件,SHARED表示動(dòng)態(tài)鏈接庫(kù);
(2)set(LIBRARY_OUTPUT_PATH:生成的庫(kù)文件路徑,PROJECT_BINARY_DIR和CMAKE_BINARY_DIR、<projectname>_BINARY_DIR都是指進(jìn)行編譯的目錄;
(3)install:安裝頭文件和庫(kù)文件到相應(yīng)的目錄;
(4)set_target_properties(libhello:生成的庫(kù)文件名為libhello.so,若沒(méi)有這一行,庫(kù)文件名就是liblibhello.so。

include_directories(${PROJECT_SOURCE_DIR}/libhello) link_directories(${CMAKE_INSTALL_PREFIX}/lib) aux_source_directory(. APP_SRC) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) add_executable(hello ${APP_SRC}) target_link_libraries(hello libhello) install(TARGETS hello RUNTIME DESTINATION bin) set_property(TARGET hello PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)

(1)include_directories:指定頭文件路徑;
(2)link_directories:指定庫(kù)文件路徑;
(3)aux_source_directory:將當(dāng)前目錄(.)中的所有文件名賦值給APP_SRC;
(4)set(EXECUTABLE_OUTPUT_PATH:生成的可執(zhí)行文件的路徑,PROJECT_BINARY_DIR和CMAKE_BINARY_DIR、<projectname>_BINARY_DIR都是指進(jìn)行編譯的目錄;
(5)add_executable:生成可執(zhí)行文件,PROJECT_SOURCE_DIR和CMAKE_SOURCE_DIR、<projectname>_SOURCE_DIR都是工程的頂級(jí)目錄;
(6)target_link_libraries:libhello要和./libhello/CMakeLists.txt中的libhello對(duì)應(yīng);
(7)install(TARGETS:安裝程序到${CMAKE_INSTALL_PREFIX}/bin目錄;
(8)set_property:設(shè)定安裝的可執(zhí)行文件所需的庫(kù)文件路徑,如果沒(méi)有該項(xiàng)設(shè)置,會(huì)出錯(cuò):cannot open shared object file: No such file or directory。

#ifndef DBZHANG_HELLO_ #define DBZHANG_HELLO_ #if defined _WIN32#if LIBHELLO_BUILD#define LIBHELLO_API __declspec(dllexport)#else#define LIBHELLO_API __declspec(dllimport)#endif #else#define LIBHELLO_API #endif LIBHELLO_API void hello(const char* name); #endif //DBZHANG_HELLO_ #include <stdio.h> #include "hello.h"void hello(const char *name) {printf ("Hello %s!\n", name); } #include "hello.h"int main(int argc, char *argv[]) {hello("World");return 0; }

在hello目錄下編譯程序:

mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX=/tmp make make install

(1)-DCMAKE_INSTALL_PREFIX=/tmp讓程序的安裝目錄變?yōu)?tmp/bin,默認(rèn)情況CMAKE_INSTALL_PREFIX=/usr/local;
(2)若在CMakeLists.txt中設(shè)置了set(CMAKE_INSTALL_PREFIX /tmp/hello),此處的設(shè)置無(wú)效。

編譯之后,hello目錄中主要文件結(jié)構(gòu):

├── build │?? ├── bin │?? │?? └── hello │?? ├── lib │?? │?? ├── libhello.so │?? │?? └── libhello.a │?? ├── libhello │?? └── src ├── CMakeLists.txt ├── libhello │?? ├── CMakeLists.txt │?? ├── hello.c │?? └── hello.h └── src├── CMakeLists.txt└── main.c

build目錄中有4個(gè)子目錄,libhello和src目錄中是源文件對(duì)應(yīng)目錄在cmake過(guò)程中生成的中間文件。

安裝后,/tmp/hello目錄內(nèi)的結(jié)構(gòu):

├── bin │?? └── hello ├── include │?? └── hello.h └── lib├── libhello.a└── libhello.so

參考資料:
http://blog.csdn.net/dbzhang800/article/details/6314073
http://blog.csdn.net/dbzhang800/article/details/6329068
http://www.cmake.org/Wiki/CMake_RPATH_handling

總結(jié)

以上是生活随笔為你收集整理的CMake使用入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。