一、開(kāi)胃菜
hello目錄下的文件結(jié)構(gòu):
C代碼見(jiàn)下節(jié)。
最簡(jiǎn)單的cmake配置文件:
如果要編譯成gdb可調(diào)試的debug版本,則在配置文件中加入:
如果要編譯成可用gprof分析的版本,則在配置文件中加入:
最簡(jiǎn)單的編譯過(guò)程(在hello目錄中編譯):
這樣就會(huì)在hello目錄中生成可執(zhí)行文件hello和其他cmake相關(guān)的配置文件。
為了讓代碼整潔,可以使用所謂的out-of-source編譯方式:
這樣編譯產(chǎn)生的所有文件都在build中了。
二、一個(gè)小工程hello示范
本例主要包含獨(dú)立庫(kù)文件、可執(zhí)行文件的編譯和安裝過(guò)程中涉及的相關(guān)問(wèn)題。
hello目錄中的文件結(jié)構(gòu):
文件內(nèi)容如下:
set(CMAKE_INSTALL_PREFIX:設(shè)置程序的安裝目錄,優(yōu)先級(jí)比cmake命令參數(shù)設(shè)置高。
1 2 3 4 5 6 7 8 9 10 | 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。
1 2 3 4 5 6 7 8 | 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。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #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_ |
在hello目錄下編譯程序:
(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目錄中有4個(gè)子目錄,libhello和src目錄中是源文件對(duì)應(yīng)目錄在cmake過(guò)程中生成的中間文件。
安裝后,/tmp/hello目錄內(nèi)的結(jié)構(gòu):
參考資料:
http://blog.csdn.net/dbzhang800/article/details/6314073
http://blog.csdn.net/dbzhang800/article/details/6329068
http://www.cmake.org/Wiki/CMake_RPATH_handling
Cmake實(shí)踐(by Cjacker)
聯(lián)系客服