使用CLion上編譯live555

         最近因爲工作需要,一直在學習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}
)

#設置爲靜態庫,庫爲名BasicUsageEnvironment
ADD_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各種智能提示的快感了。


最後附上源碼,有需要的童鞋可以下載玩一玩。

發佈了56 篇原創文章 · 獲贊 27 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章