使用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各种智能提示的快感了。


最后附上源码,有需要的童鞋可以下载玩一玩。

0 0
原创粉丝点击