使用cmake编译程序
cd /path/of/CMakeList.txt
cmake .
make
make install
语法
1. LINK_DIRECTORIES
查找动态库路径,相当于Makefile的-L选项,且该方法必须在ADD_LIBRARY和ADD_EXECUTABLE之前
2. 链接静态库
ADD_LIBRARY(curl STATIC IMPORTED)
SET_TARGET_PROPERTIES(curl PROPERTIES IMPORTED_LOCATION /path/to/libcurl.a)
TARGET_LINK_LIBRARIES(${PAORJUECT_NAME} PRIVATE curl)
注意:
1) 某些时候TARGET_LINK_LIBRARIES需要在中间 增加PRIVATE这个关键字,需要配合上下文来确定
2) TARGET_LINK_LIBRARIES必须在ADD_LIBRARY和ADD_EXECUTABLE之后
3. 链接动态库
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib) #添加动态连接库的路径
TARGET_LINK_LIBRARIES(${PROJECT_NAME} curl)
4. 头文件目录
INCLUDE_DIRECTORIES(/path/to/include/dir1 /path/to/include/dir2)
5. 编译静态库、动态库
ADD_LIBRARY(${TARGET} SHARED ${DIR_SRCS})
ADD_LIBRARY(${TARGET} STATIC ${DIR_SRCS})
注意:
1) 一个CMakeLists.txt里面不能设置两个名称一样的ADD_LIBRARY
2) 如果要同时编译静态库跟动态库,且希望静态库和动态库名称一样时(libxxx.so和libxxx.a而不是libxxx.so和libyyy.a),可以这样写
ADD_LIBRARY(${TARGET} SHARED ${DIR_SRCS})
ADD_LIBRARY(${TARGET}_static STATIC ${DIR_SRCS})
#set static library name
SET_TARGET_PROPERTIES(${TARGET}_static PROPERTIES OUTPUT_NAME ${TARGET})
# cmake在构建一个新的target时,会尝试清理掉其他使用这个名字的库,
# 因此,在构建libhello.a时,就会清理掉libhello.so.
# 为了回避这个问题,设置CLEAN_DIRECT_OUTPUT属性为1。
set_target_properties(${TARGET} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
set_target_properties(${TARGET}_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
6. CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH
注意:这两个是环境变量而不是 cmake 变量。
使用方式:CMAKE_INCLUDE_PATH=/home/include cmake .
7. FIND_LIBRARY
注意:尽量不要使用该方法。这个方法最终翻译成-rpath选项,会指定目标文件在该绝对路径下查找指定的动态库
8. install
安装可执行文件
INSTALL(TARGETS ${TARGET}
RUNTIME DESTINATION bin
)
安装库文件
INSTALL(TARGETS ${TARGET} ${TARGET}_static #关键字TARGETS后跟多个目标文件,后面再描述每一个目标文件的执行方法
LIBRARY DESTINATION lib #关键字LIBRARY表示目标文件是动态库,复制到${CMAKE_INSTALL_PREFIX}/lib目录
ARCHIVE DESTINATION lib #关键字ARCHIVE表示目标文件是静态库,复制到${CMAKE_INSTALL_PREFIX}/lib目录
)
安装目录下的文件
INSTALL(DIRECTORY "${OUTPUT_HEADER_FILES}/" #关键字DIRECTORY表示复制目录,后面是源目录,如果源目录最后带'/',表示把源目录下的文件复制到目标地址,如果没有,表示把源目录复制到目标地址
DESTINATION include #关键字DESTINATION表示目标地址,完整的路径是${CMAKE_INSTALL_PREFIX}/include
FILES_MATCHING PATTERN "*.h" #关键字FILES_MATCHING表示只复制源目录下*.h的文件到目标地址
)