下面是自己写的一个cmake的例子, 编译的过程中碰到了很多麻烦问题, 贴出来分享下。
##################################################
#### minidlna: dms
##################################################
MACRO( MA_IMPORT_LIB name type libname file )
ADD_LIBRARY( ${name} ${type} IMPORTED )
SET_PROPERTY( TARGET ${name} PROPERTY IMPORTED_LOCATION ${EXTERNAL_LIB_PATH}/${libname}/${TOOLCHAIN_LIB_FOLDER}/${file} )
ENDMACRO( MA_IMPORT_LIB )
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(DMS)
# which tools to use
SET(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
SET(CMAKE_STRIP arm-linux-gnueabihf-strip)
# here is where the target environment located
SET(CMAKE_FIND_ROOT_PATH /opt/arm/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux/arm-linux-gnueabihf/libc/lib/ )
SET(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/release)
SET(EXTERNAL_INSTALL_PATH ${PROJECT_SOURCE_DIR}/install)
SET(EXTERNAL_LIB_PATH ${PROJECT_SOURCE_DIR}/install/lib)
SET(SOURCE_PATH ${PROJECT_SOURCE_DIR}/dms)
SET(TOOLCHAIN_LIB_FOLDER arm-linux-gnueabihf-4.9)
SET(program dms)
#config DMS DTCP-IP function.
SET(SUPPORT_DLNA_DTCP_IP 1)
if(SUPPORT_DLNA_DTCP_IP EQUAL 1)
ADD_DEFINITIONS( -DDLNA_SOURCE_DTCP_IP_ENABLE )
endif(SUPPORT_DLNA_DTCP_IP EQUAL 1)
INCLUDE_DIRECTORIES( opt/arm/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux/arm-linux-gnueabihf/libc/usr/include )
INCLUDE_DIRECTORIES(
${PROJECT_SOURCE_DIR}/dms
${PROJECT_SOURCE_DIR}/dms/linux
${PROJECT_SOURCE_DIR}/dms/tagutils
${EXTERNAL_INSTALL_PATH}/include/
${EXTERNAL_INSTALL_PATH}/include/sqlite3
...
${EXTERNAL_INSTALL_PATH}/include/zlib
)
AUX_SOURCE_DIRECTORY(${SOURCE_PATH} SOURCE_LIST)
ADD_EXECUTABLE(${program} ${SOURCE_LIST} )
#ADD_EXECUTABLE(${Program} ${LINK_LIBS})
SET_TARGET_PROPERTIES( ${program} PROPERTIES LINKER_LANGUAGE CXX )
SET_TARGET_PROPERTIES( ${program} PROPERTIES OUTPUT_NAME "minidlna" )
#static third library
MA_IMPORT_LIB( avutil STATIC ffmpeg libavutil.a )
MA_IMPORT_LIB( avcodec STATIC ffmpeg libavcodec.a )
MA_IMPORT_LIB( avformat STATIC ffmpeg libavformat.a )
#shared third library
MA_IMPORT_LIB( crypto SHARED openssl libcrypto.so) # libcrypto.so.0
MA_IMPORT_LIB( dtcp_ip SHARED dtcp_ip libdtcp_ip.so ) # libdtcp_ip.so
MA_IMPORT_LIB( flac SHARED flac libFLAC.so ) # libFLAC.so.8
MA_IMPORT_LIB( ogg SHARED ogg libogg.so) # libogg.so.0
MA_IMPORT_LIB( sqlite3 SHARED sqlite3 libsqlite3.so ) # libsqlite3
target_link_libraries(${program} pthread)
target_link_libraries(${program} -Wl,--start-group id3tag flac dtcp_ip ogg vorbis exif crypto nteec sqlite3 jpeg png z avutil avcodec avformat -Wl,--end-group)
INSTALL(TARGETS ${program} DESTINATION .)
1. 编译前必须在本地编译环境配置 arm-linux-gnueabihf-gcc的PATH路径。
2. 添加宏定义使用的是ADD_DEFINITIONS( -DDLNA_SOURCE_DTCP_IP_ENABLE )
3. AUX_SOURCE_DIRECTORY(${SOURCE_PATH} SOURCE_LIST) 可以将${SOURCE_PATH}路径下的source文件全部家当LIST中, 这样就避免一个个文件手动添加了
5. 有时候使用target_link_libraries(${program} pthread)这种方式link会出现找不到接口的问题, 改为 target_link_libraries(${program} -Wl,--start-group *** -Wl,--end-group)就OK了。
4. 如果需要link外部编译的库, 必须使用MA_IMPORT_LIB( avformat STATIC ffmpeg libavformat.a )方式提前import进来, 具体看MA_IMPORT_LIB的定义。
5. ADD_EXECUTABLE(${program} ${SOURCE_LIST} ) 一定要在target_link_libraries前面, 不然就会出现link错误。