cmake学习实例

下面是自己写的一个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错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值