使用CLion上编译live555
来源:互联网 发布:unity3d sharesdk ios 编辑:程序博客网 时间:2024/04/27 21:49
最近因为工作需要,一直在学习C和C++,开发工具一直使用VS2010,由于之前一直使用java语言的,不管使用当初的Eclipse,还是之后的Android Studio都是各有很强的智能提示,于是乎在使用VS2010编写C++程序时,各种不习惯。由于工作的需要,没办法,只能硬着头皮上了,还好一路下来,发现已经各种VS2010,不得不说VS的功能实现在太强大了。后来无意间发现Clion,于是下载下载玩了一下,它是一款专为开发C及C++所设计的跨平台IDE,IntelliJ为基础设计的,和Android Studio一样,用习惯Android Studio以后,瞬间爱上他了。试玩过后,决定以后开发C和C++就决定用它了。说干就干,第一个当然最live555来开刀了,于是乎,就研究了一下如何让能够live555能够在Clion上跑起来,折腾了一翻,终于大功告成。由于网上对Clion具体移植和使用方法比较少,自已编译花了不少功能,现在把过程以及遇到的一些问题分享出来,其实很简单,以便需要的童鞋很快上手。
由于Clion配置以及编译主要使用的Cmake,不熟悉Cmake可以先去Cmake熟悉下基本语法,方便后面编写CMmakeList.txt。
1、新建Clion工程,取名为Live555ForAndroid;
2、下载最新的live555源码,把live文件夹下面的文件全部复制到Live555ForAndroid工程下面;
3、编写Live555ForAndroid下面CMmakeList.txt文件, 文件内容如下:
#当前cmake版本号cmake_minimum_required(VERSION 3.6)#当前工程名称project(Live555ForAndroid)#设置C++编译参数set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")#设置可执行文件输出路径SET(EXECUTABLE_OUTPUT_PATH ${Live555ForAndroid_SOURCE_DIR}/bin)#设置链接lib输出路径SET(LIBRARY_OUTPUT_PATH ${Live555ForAndroid_SOURCE_DIR}/lib)#设置运行时查找输出路径SET(RUNTIME_OUTPUT_DIRECTORY ${Live555ForAndroid_SOURCE_DIR}/bin)#指定lib输出路径set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${Live555ForAndroid_SOURCE_DIR}/lib)#指定bin为library输出路径set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${Live555ForAndroid_SOURCE_DIR}/bin)#指定bin为Runtime输出路径set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Live555ForAndroid_SOURCE_DIR}/bin)#指定include头文件路径SET(Live555ForAndroidIncludes ${Live555ForAndroid_SOURCE_DIR}/BasicUsageEnvironment/include ${Live555ForAndroid_SOURCE_DIR}/groupsock/include ${Live555ForAndroid_SOURCE_DIR}/liveMedia/include ${Live555ForAndroid_SOURCE_DIR}/UsageEnvironment/include )#当前当前工程目录下面子目录ADD_SUBDIRECTORY(BasicUsageEnvironment)ADD_SUBDIRECTORY(groupsock)ADD_SUBDIRECTORY(liveMedia)ADD_SUBDIRECTORY(mediaServer)ADD_SUBDIRECTORY(proxyServer)ADD_SUBDIRECTORY(UsageEnvironment)4、编写BasicUsageEnvironment目录下面CMakeLists.txt文件:
# CMakeLists.txt in BasicUsageEnvironment#设置源路径需要编译.cpp文件SET(BASIC_USAGE_ENVIRONMENT_SRCS BasicHashTable.cpp BasicTaskScheduler.cpp BasicTaskScheduler0.cpp BasicUsageEnvironment.cpp BasicUsageEnvironment0.cpp DelayQueue.cpp)#设置include .hh头文件SET(BASIC_USAGE_ENVIRONMENT_HEADERS include/BasicHashTable.hh include/BasicUsageEnvironment.hh include/BasicUsageEnvironment0.hh include/BasicUsageEnvironment_version.hh include/DelayQueue.hh include/HandlerSet.hh)#include引用其他目录下面的头文件INCLUDE_DIRECTORIES( ${Live555ForAndroidIncludes})#设置为静态库,库为名BasicUsageEnvironmentADD_LIBRARY( BasicUsageEnvironment STATIC ${BASIC_USAGE_ENVIRONMENT_HEADERS} ${BASIC_USAGE_ENVIRONMENT_SRCS})5、编写groupsock目录下面CMakeLists.txt文件:
# CMakeLists.txt in groupsock#编译源文件SET(GROUPSOCK_SRCS GroupEId.cpp Groupsock.cpp GroupsockHelper.cpp inet.c IOHandlers.cpp NetAddress.cpp NetInterface.cpp)#编译头文件SET(GROUPSOCK_HEADERS include/GroupEId.hh include/Groupsock.hh include/GroupsockHelper.hh include/groupsock_version.hh include/IOHandlers.hh include/NetAddress.hh include/NetInterface.hh include/TunnelEncaps.hh)##include引用其他目录下面的头文件INCLUDE_DIRECTORIES( ${Live555ForAndroidIncludes})#生成静态库ADD_LIBRARY( groupsock STATIC ${GROUPSOCK_HEADERS} ${GROUPSOCK_SRCS})#链接其他静态库,如果不加此句,否则在link出现错误TARGET_LINK_LIBRARIES( groupsock BasicUsageEnvironment liveMedia UsageEnvironment ws2_32 winmm)6、编写liveMedia目录下面CMakeLists.txt文件:
# CMakeLists.txt in groupsock#编译源文件SET(GROUPSOCK_SRCS GroupEId.cpp Groupsock.cpp GroupsockHelper.cpp inet.c IOHandlers.cpp NetAddress.cpp NetInterface.cpp)#编译头文件SET(GROUPSOCK_HEADERS include/GroupEId.hh include/Groupsock.hh include/GroupsockHelper.hh include/groupsock_version.hh include/IOHandlers.hh include/NetAddress.hh include/NetInterface.hh include/TunnelEncaps.hh)##include引用其他目录下面的头文件INCLUDE_DIRECTORIES( ${Live555ForAndroidIncludes})#生成静态库ADD_LIBRARY( groupsock STATIC ${GROUPSOCK_HEADERS} ${GROUPSOCK_SRCS})#链接其他静态库,如果不加此句,否则在link出现错误TARGET_LINK_LIBRARIES( groupsock BasicUsageEnvironment liveMedia UsageEnvironment ws2_32 winmm)7、编写mediaServer目录下面的CMakeLists.txt文件:
# CMakeLists.txt mediaServer directory#头文件SET(MEDIA_SERVER_HDRS DynamicRTSPServer.hh)#源文件SET(MEDIA_SERVER_SRCS DynamicRTSPServer.cpp live555MediaServer.cpp)#包含头文件目录INCLUDE_DIRECTORIES( ${Live555ForAndroidIncludes})#主程序入口,可执行程序入口ADD_EXECUTABLE(mediaServer ${MEDIA_SERVER_HDRS} ${MEDIA_SERVER_SRCS})#链接库文件TARGET_LINK_LIBRARIES( mediaServer BasicUsageEnvironment groupsock liveMedia UsageEnvironment ws2_32 winmm)8、编写UsageEnvironment目录下面的CMakeLists.txt文件:
# CMakeLists.txt in UsageEnvironment#源文件SET(USAGE_ENVIRONMENT_SRCS HashTable.cpp strDup.cpp UsageEnvironment.cpp)#头文件SET(USAGE_ENVIRONMENT_HEADERS include/Boolean.hh include/HashTable.hh include/strDup.hh include/UsageEnvironment.hh include/UsageEnvironment_version.hh)#包含头文件INCLUDE_DIRECTORIES( ${Live555ForAndroidIncludes})#生成静态库ADD_LIBRARY( UsageEnvironment STATIC ${USAGE_ENVIRONMENT_HEADERS} ${USAGE_ENVIRONMENT_SRCS})
9、至此,目录下面主要的CMakeLists.txt文件已经编写好了,开始编译运行;
出现第一个错误,错误如下:
出现此原因是因为CMake不支持-std=C++11,解决方案参考我的另外一篇博客使用Clion新建项目出现编译出错;
10、解决好以后继续选择mediaServer,Build,接着又会出现以下错误:
"E:\Android\AndroidDevTools\CLion 2016.2.1\bin\cmake\bin\cmake.exe" --build C:\Users\lqm\.CLion2016.2\system\cmake\generated\Live555ForAndroid-194819de\194819de\Debug --target mediaServer -- -j 4
[ 4%] Built target groupsock
[ 6%] Built target proxyServer
[ 8%] Built target UsageEnvironment
[ 9%] Built target WindowsAudioInputDevice
[ 12%] Built target BasicUsageEnvironment
[ 99%] Built target liveMedia
[ 99%] Linking CXX executable mediaServer.exe
libBasicUsageEnvironment.a(BasicTaskScheduler.cpp.obj): In function `ZN18BasicTaskSchedulerD2Ev':
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:50: undefined reference to `closesocket@4'
libBasicUsageEnvironment.a(BasicTaskScheduler.cpp.obj): In function `ZN18BasicTaskScheduler10SingleStepEj':
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:90: undefined reference to `select@20'
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:93: undefined reference to `WSAGetLastError@0'
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:99: undefined reference to `closesocket@4'
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:100: undefined reference to `socket@12'
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:115: undefined reference to `__WSAFDIsSet@8'
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:115: undefined reference to `__WSAFDIsSet@8'
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:115: undefined reference to `__WSAFDIsSet@8'
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:117: undefined reference to `__WSAFDIsSet@8'
E:/Android/clion/Live555ForAndroid/BasicUsageEnvironment/BasicTaskScheduler.cpp:118: undefined reference to `__WSAFDIsSet@8'
出现此问题原因是因为在在链接时找不到ws2_32和winmm库,在mediaServer目录下面的CMakeLists.txt文件中增加
TARGET_LINK_LIBRARIES(
mediaServer
BasicUsageEnvironment
groupsock
liveMedia
UsageEnvironment
ws2_32
winmm
)
11、修复此问题以后,继续选择mediaServer,Build,会出现如下错误:
E:/Android/clion/Live555ForAndroid/liveMedia/GenericMediaServer.cpp:95: undefined reference to `HashTable::create(int)'
E:/Android/clion/Live555ForAndroid/liveMedia/GenericMediaServer.cpp:96: undefined reference to `HashTable::create(int)'
E:/Android/clion/Live555ForAndroid/liveMedia/GenericMediaServer.cpp:97: undefined reference to `HashTable::create(int)'
E:/Android/clion/Live555ForAndroid/liveMedia/GenericMediaServer.cpp:98: undefined reference to `ignoreSigPipeOnSocket(int)'
libliveMedia.a(GenericMediaServer.cpp.obj): In function `ZN18GenericMediaServerD2Ev':
E:/Android/clion/Live555ForAndroid/liveMedia/GenericMediaServer.cpp:107: undefined reference to `closesocket@4'
libliveMedia.a(GenericMediaServer.cpp.obj): In function `ZN18GenericMediaServer7cleanupEv':
E:/Android/clion/Live555ForAndroid/liveMedia/GenericMediaServer.cpp:119: undefined reference to `HashTable::getFirst()'
E:/Android/clion/Live555ForAndroid/liveMedia/GenericMediaServer.cpp:126: undefined reference to `HashTable::getFirst()'
E:/Android/clion/Live555ForAndroid/liveMedia/GenericMediaServer.cpp:133: undefined reference to `HashTable::getFirst()'
这个问题产生是因为live555模块之间需要相互链接,分别在groupsock目录下面的CMakeLists.txt增加
TARGET_LINK_LIBRARIES(
groupsock
BasicUsageEnvironment
liveMedia
UsageEnvironment
ws2_32
winmm
)
然后在liveMedia目录下面的CMakeLists.txt文件增加
TARGET_LINK_LIBRARIES(
liveMedia
BasicUsageEnvironment
groupsock
UsageEnvironment
ws2_32
winmm
)
12、解决上述问题以后,恭喜你,live555能够在Clion上面调试了,你可以尽情的享受Clion各种调试以及和Android Studio各种智能提示的快感了。
最后附上源码,有需要的童鞋可以下载玩一玩。
- 使用CLion上编译live555
- vs2013上编译live555
- linux上编译live555
- 使用VS2010编译live555
- VS2012编译、使用live555
- 使用VS2010编译live555
- 使用mingw编译live555
- Clion 使用自己编写的 Makefile编译
- 使用Clion新建项目出现编译出错
- ubuntu里面live555编译使用
- live555编译使用及测试
- CLion使用
- 在NanoPi-NEO上直接编译 LIVE555
- live555—VS2010 下live555编译、使用及测试
- live555—VS2010 下live555编译、使用及测试
- 【流媒體】live555—VS2010 下live555编译、使用及测试
- live555—VS2010 下live555编译、使用及测试
- 【转】live555—VS2010 下live555编译、使用及测试
- android developer tiny share-20161021
- Java集合之Map
- Python实现CRC校验
- C/C++笔试必须熟悉掌握的头文件系列(八)——algorithm
- R语言学习笔记(4)
- 使用CLion上编译live555
- Android开发——Activity跳转动画
- bzoj2348: [Baltic 2011]Plagiarism(水题)
- 使用夜神模拟器进行Android开发调试
- git使用综合
- 随笔(一)
- shell脚本中echo显示内容带颜色
- [服务器]PC端远程桌面OK,PDA无法连接
- 带版本号的so文件生成不带版本号的软链接