如果你覺得makefile看着就頭痛,如果當工程越來越大,你越來越手足無措,如果你厭倦了在編譯的時候打上一大堆指令,那麼你有必要花十分鐘來看一下下面的内容。
一、HelloWorld
首先建立一個test1檔案夾,裡面建立一個main.c檔案,内容如下:
#include <stdio.h> int main() { printf("Hello World!\n"); return 0; }
再建立一個CMakeLists.txt
PROJECT (HELLO) SET(SRC_LIST main.c) ADD_EXECUTABLE(hello ${SRC_LIST})
第一行:設定項目名稱;
第二行:将SRC_LIST值設定為main.c
第三行:生成可執行檔案 hello。 ${} 是引用某個值。
Terminal中cd進入到test1目錄,建立一個build目錄用于外部建構(編譯所産生的檔案都生成在build目錄),依次執行下面三條指令:
cmake .. make ./hello
得到的結果如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxcjN38VN3QTO4QTN1MTMvwFNx8CXyEjMxAjMvw1ckF2bsBXdvwFdl5mLuR2cj5Set1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如果要引用内部庫的話,比如是關于SDL和opengl的程式,需要在CMakeLists.txt中添加
TARGET_LINK_LIBRARIES(hello SDL) TARGET_LINK_LIBRARIES(hello GLU)
對應終端的編譯指令就是:
-lSDL -lGLU
若不是引用内部庫,則需要将相應目錄添加進來,用到的是 INCLUDE_DIRECTORIES 指令。
二、庫的建構與安裝
這次我們的目标是:
1,建立一個靜态庫和動态庫,提供 HelloFunc 函數供其他程式程式設計使用,HelloFunc 向終端輸出
Hello World 字元串。
2,安裝頭檔案與共享庫。
目錄安排如下:
build-用于外部編譯;
libhello-hello庫的源檔案;
src-主程式
首先看libhello裡的檔案:
/*filename:hello.h*/ #ifndef DBZHANG_HELLO_ #define DBZHANG_HELLO_ void hello(const char* name); #endif //DBZHANG_HELLO_
/*filename:hello.c*/ #include <stdio.h> #include "hello.h" void hello(const char * name) { printf ("Hello %s!\n", name); }
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) set(LIB_SRC hello.c) add_library(libhello STATIC ${LIB_SRC}) set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello") install(TARGETS libhello LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) install(FILES hello.h DESTINATION include/hello)
src檔案夾
/*filename:main.c*/ #include "hello.h" int main() { hello("Jack"); return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) include_directories(${PROJECT_SOURCE_DIR}/libhello) set(APP_SRC main.c) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) add_executable(main ${APP_SRC}) target_link_libraries(main libhello)
最外面的CMakeLists.txt
project(HELLO) add_subdirectory(src) add_subdirectory(libhello)
解釋:
除build目錄外每一個目錄都要建立一個CMakeLists.txt.
生成庫的語句:add_library(libhello STATIC ${LIB_SRC})
這條語句是建立靜态庫,若要建立動态庫的話将STATIC改成SHARED.
install指令負責庫的安裝。
make一下,結果就像這樣:
再sudo make install.
安裝好庫之後,我們在想使用hello方法的時候,隻要添加頭檔案#include<hello.h>就可以了,編譯的時候
g++ main .c -o main -lhello
就可以引用我們編譯好的庫了。
轉載于:https://blog.51cto.com/8672742/1368346