2016-04-11 275 views
0

在大型嵌入式Linux代碼庫/ SDK上工作「這裏沒有發明」 - 由Elbonian Code Slaves在海外發明,將各種各樣的東西釘在一起。添加-lrt時,追蹤編譯器錯誤「undefined reference」

代碼庫的一部分是Live555 WIS-Streamer。爲了(嘗試)修復與時間戳相關的竅門,我插入了幾個調用clock_gettime(CLOCK_MONOTONIC, &ts);,然後導致編譯失敗,出現了幾個undefined reference to 'clock_gettime'錯誤。

我以前有過這個,並且通過將-lrt添加到編譯器選項來包含librealtime來解決,但是這一次它沒有幫助。我做了大量的搜索和閱讀,但是我看不到任何明確的答案,並且項目的makefile比整個web上發現的例子複雜得多。

我需要一些幫助,或者指出我在makefile中所做的明顯錯誤,或者通過鏈接跟蹤編譯器的期望,以查看我需要做出更改的位置。

這個項目是使用給定硬件的一套庫進行交叉編譯的,所以-lrt仍然是必需的(我認爲它在後面的gcc庫中不再需要),我們不能輕易更新或更改那些東西。

這裏有一個失敗的編譯器輸出的代碼片斷,有很多冗長。我縮短了路徑名稱,以保持郵政大小限制。

make[10]: Entering directory `/ipnc_rdk/ipnc_app/network/live/testProgs' 
/ipnc_rdk/../dvsdk_ipnctools/linux-devkit//bin/arm-arago-linux-gnueabi-g++ -c -I../UsageEnvironment/include -I../groupsock/include -I../liveMedia/include -I../BasicUsageEnvironment/include -I. -O3 -v -DSOCKLEN_T=socklen_t -DNO_STRSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -Wl,--verbose -lrt -Wall -DBSD=1 testMP3Streamer.cpp 
Using built-in specs. 
Target: arm-arago-linux-gnueabi 
Thread model: posix 
gcc version 4.3.3 (GCC) 
COLLECT_GCC_OPTIONS='-c' '-I../UsageEnvironment/include' '-I../groupsock/include' '-I../liveMedia/include' '-I../BasicUsageEnvironment/include' '-I.' '-O3' '-v' '-DSOCKLEN_T=socklen_t' '-DNO_STRSTREAM=1' '-D_LARGEFILE_SOURCE=1' '-D_FILE_OFFSET_BITS=64' '-Wall' '-DBSD=1' '-shared-libgcc' '-mfloat-abi=soft' 
../libexec/gcc/arm-arago-linux-gnueabi/4.3.3/cc1plus -quiet -v -I../UsageEnvironment/include -I../groupsock/include -I../liveMedia/include -I../BasicUsageEnvironment/include -I. -iprefix ../lib/gcc/arm-arago-linux-gnueabi/4.3.3/ -isysroot ../arm-arago-linux-gnueabi -D_GNU_SOURCE -DSOCKLEN_T=socklen_t -DNO_STRSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DBSD=1 testMP3Streamer.cpp -quiet -dumpbase testMP3Streamer.cpp -mfloat-abi=soft -auxbase testMP3Streamer -O3 -Wall -version -o /tmp/cckqq421.s 
ignoring duplicate directory "../lib/gcc/../../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/include/c++/4.3.3" 
ignoring duplicate directory "../lib/gcc/../../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/include/c++/4.3.3/arm-arago-linux-gnueabi" 
ignoring duplicate directory "../lib/gcc/../../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/include/c++/4.3.3/backward" 
ignoring nonexistent directory "../arm-arago-linux-gnueabi/usr/local/include" 
ignoring duplicate directory "../lib/gcc/../../lib/gcc/arm-arago-linux-gnueabi/4.3.3/include" 
ignoring duplicate directory "../lib/gcc/../../lib/gcc/arm-arago-linux-gnueabi/4.3.3/include-fixed" 
ignoring duplicate directory "../lib/gcc/../../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/include" 
#include "..." search starts here: 
#include <...> search starts here: 
../UsageEnvironment/include 
../groupsock/include 
../liveMedia/include 
../BasicUsageEnvironment/include 
. 
../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/include/c++/4.3.3 
../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/include/c++/4.3.3/arm-arago-linux-gnueabi 
../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/include/c++/4.3.3/backward 
../lib/gcc/arm-arago-linux-gnueabi/4.3.3/include 
../lib/gcc/arm-arago-linux-gnueabi/4.3.3/include-fixed 
../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/include 
../arm-arago-linux-gnueabi/usr/include 
End of search list. 
GNU C++ (GCC) version 4.3.3 (arm-arago-linux-gnueabi) 
    compiled by GNU C version 4.4.3, GMP version 4.2.4, MPFR version 3.0.0-p7. 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
Compiler executable checksum: 05177eff49440274f3899a250a52b5a7 
COLLECT_GCC_OPTIONS='-c' '-I../UsageEnvironment/include' '-I../groupsock/include' '-I../liveMedia/include' '-I../BasicUsageEnvironment/include' '-I.' '-O3' '-v' '-DSOCKLEN_T=socklen_t' '-DNO_STRSTREAM=1' '-D_LARGEFILE_SOURCE=1' '-D_FILE_OFFSET_BITS=64' '-Wall' '-DBSD=1' '-shared-libgcc' '-mfloat-abi=soft' 
../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/bin/as -mfloat-abi=soft -meabi=4 -o testMP3Streamer.o /tmp/cckqq421.s 
COMPILER_PATH=../libexec/gcc/arm-arago-linux-gnueabi/4.3.3/:../libexec/gcc/:../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/bin/ 
LIBRARY_PATH=../lib/gcc/arm-arago-linux-gnueabi/4.3.3/:../lib/gcc/:../lib/gcc/arm-arago-linux-gnueabi/4.3.3/../../../../arm-arago-linux-gnueabi/lib/:../arm-arago-linux-gnueabi/lib/:../arm-arago-linux-gnueabi/usr/lib/ 
COLLECT_GCC_OPTIONS='-c' '-I../UsageEnvironment/include' '-I../groupsock/include' '-I../liveMedia/include' '-I../BasicUsageEnvironment/include' '-I.' '-O3' '-v' '-DSOCKLEN_T=socklen_t' '-DNO_STRSTREAM=1' '-D_LARGEFILE_SOURCE=1' '-D_FILE_OFFSET_BITS=64' '-Wall' '-DBSD=1' '-shared-libgcc' '-mfloat-abi=soft' 
/ipnc_rdk/../dvsdk_ipnctools/linux-devkit//bin/arm-arago-linux-gnueabi-g++ -otestMP3Streamer -L. testMP3Streamer.o ../liveMedia/libliveMedia.a ../groupsock/libgroupsock.a ../BasicUsageEnvironment/libBasicUsageEnvironment.a ../UsageEnvironment/libUsageEnvironment.a 
../liveMedia/libliveMedia.a: In function `RTPSink::presetNextTimestamp()': 
Locale.cpp:(.text+0x3232c): undefined reference to `clock_gettime' 
../liveMedia/libliveMedia.a: In function `RTCPInstance::addSR()': 
Locale.cpp:(.text+0x36dd8): undefined reference to `clock_gettime' 
../BasicUsageEnvironment/libBasicUsageEnvironment.a: In function `TimeNow()': 
BasicHashTable.cpp:(.text+0x1edc): undefined reference to `clock_gettime' 
../BasicUsageEnvironment/libBasicUsageEnvironment.a: In function `DelayQueue::DelayQueue()': 
BasicHashTable.cpp:(.text+0x2378): undefined reference to `clock_gettime' 
../BasicUsageEnvironment/libBasicUsageEnvironment.a: In function `DelayQueue::DelayQueue()': 
BasicHashTable.cpp:(.text+0x2414): undefined reference to `clock_gettime' 
../BasicUsageEnvironment/libBasicUsageEnvironment.a:BasicHashTable.cpp:(.text+0x246c): more undefined references to `clock_gettime' follow 
collect2: ld returned 1 exit status 
make[10]: *** [testMP3Streamer] Error 1 

不幸的是,我似乎已經擊中門柱長度限制我不能附加生成文件的完整輸出或內容!這裏是大多數makefile文件之一,我已經把...snip...在那裏我已經削減了很多類似的條目,你可能已經猜到了事情的原委:

INCLUDES = -Iinclude -I../UsageEnvironment/include -I../groupsock/include 
PREFIX = /usr/local 
LIBDIR = $(PREFIX)/lib 
##### Change the following for your environment: 
CROSS_COMPILE=  $(MVTOOL_PREFIX) 
COMPILE_OPTS =  $(INCLUDES) -I. -v -Wall -O3 -DSOCKLEN_T=socklen_t -DNO_STRSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -Wl,--verbose -lrt 
### JU - Added -lrt for MONOTONIC CLOCK in RTPSink.cpp 
C =   c 
C_COMPILER =  $(CROSS_COMPILE)gcc 
C_FLAGS =  $(COMPILE_OPTS) 
CPP =   cpp 
CPLUSPLUS_COMPILER = $(CROSS_COMPILE)g++ 
CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -DBSD=1 
OBJ =   o 
LINK =   $(CROSS_COMPILE)g++ -o 
LINK_OPTS =  -L. 
CONSOLE_LINK_OPTS = $(LINK_OPTS) 
LIBRARY_LINK =  $(CROSS_COMPILE)ld -o 
LIBRARY_LINK_OPTS = $(LINK_OPTS) -r -Bstatic 
LIB_SUFFIX =   a 
LIBS_FOR_CONSOLE_APPLICATION = 
LIBS_FOR_GUI_APPLICATION = 
EXE = 
##### End of variables to change 

NAME = libliveMedia 
LIVEMEDIA_LIB = $(NAME).$(LIB_SUFFIX) 
ALL = $(LIVEMEDIA_LIB) 
all: $(ALL) 

.$(C).$(OBJ): 
    $(C_COMPILER) -c $(C_FLAGS) $<  
.$(CPP).$(OBJ): 
    $(CPLUSPLUS_COMPILER) -c $(CPLUSPLUS_FLAGS) $< 

MP3_SOURCE_OBJS = MP3FileSource.$(OBJ) ...snip... MP3InternalsHuffman.$(OBJ) MP3InternalsHuffmanTable.$(OBJ) MP3ADURTPSource.$(OBJ) 
MPEG_SOURCE_OBJS = MPEG1or2Demux.$(OBJ) ...snip... ADTSAudioFileSource.$(OBJ) 
H263_SOURCE_OBJS = H263plusVideoRTPSource.$(OBJ) H263plusVideoStreamFramer.$(OBJ) H263plusVideoStreamParser.$(OBJ) 
AC3_SOURCE_OBJS = AC3AudioStreamFramer.$(OBJ) AC3AudioRTPSource.$(OBJ) 
DV_SOURCE_OBJS = DVVideoStreamFramer.$(OBJ) DVVideoRTPSource.$(OBJ) 
MP3_SINK_OBJS = MP3ADURTPSink.$(OBJ) 
MPEG_SINK_OBJS = MPEG1or2AudioRTPSink.$(OBJ) $(MP3_SINK_OBJS) MPEG1or2VideoRTPSink.$(OBJ) MPEG4LATMAudioRTPSink.$(OBJ) MPEG4GenericRTPSink.$(OBJ) MPEG4ESVideoRTPSink.$(OBJ) 
H263_SINK_OBJS = H263plusVideoRTPSink.$(OBJ) 
H264_OR_5_SINK_OBJS = H264or5VideoRTPSink.$(OBJ) H264VideoRTPSink.$(OBJ) H265VideoRTPSink.$(OBJ) 
DV_SINK_OBJS = DVVideoRTPSink.$(OBJ) 
AC3_SINK_OBJS = AC3AudioRTPSink.$(OBJ) 

MISC_SOURCE_OBJS = MediaSource.$(OBJ) ...snip... StreamReplicator.$(OBJ) 
MISC_SINK_OBJS = MediaSink.$(OBJ) ...snip... OutputFile.$(OBJ) 
MISC_FILTER_OBJS = uLawAudioFilter.$(OBJ) 
TRANSPORT_STREAM_TRICK_PLAY_OBJS = MPEG2IndexFromTransportStream.$(OBJ) MPEG2TransportStreamIndexFile.$(OBJ) MPEG2TransportStreamTrickModeFilter.$(OBJ) 

RTP_SOURCE_OBJS = RTPSource.$(OBJ) ...snip... VP9VideoRTPSource.$(OBJ) 
RTP_SINK_OBJS = RTPSink.$(OBJ) MultiFramedRTPSink.$(OBJ) AudioRTPSink.$(OBJ) VideoRTPSink.$(OBJ) TextRTPSink.$(OBJ) 
RTP_INTERFACE_OBJS = RTPInterface.$(OBJ) 
RTP_OBJS = $(RTP_SOURCE_OBJS) $(RTP_SINK_OBJS) $(RTP_INTERFACE_OBJS) 

RTCP_OBJS = RTCP.$(OBJ) rtcp_from_spec.$(OBJ) 
GENERIC_MEDIA_SERVER_OBJS = GenericMediaServer.$(OBJ) 
RTSP_OBJS = RTSPServer.$(OBJ) RTSPClient.$(OBJ) RTSPCommon.$(OBJ) RTSPServerSupportingHTTPStreaming.$(OBJ) RTSPRegisterSender.$(OBJ) 
SIP_OBJS = SIPClient.$(OBJ) 

SESSION_OBJS = MediaSession.$(OBJ) ...snip... ProxyServerMediaSession.$(OBJ) 

QUICKTIME_OBJS = QuickTimeFileSink.$(OBJ) QuickTimeGenericRTPSource.$(OBJ) 
AVI_OBJS = AVIFileSink.$(OBJ) 

MATROSKA_FILE_OBJS = MatroskaFile.$(OBJ) MatroskaFileParser.$(OBJ) EBMLNumber.$(OBJ) MatroskaDemuxedTrack.$(OBJ) 
MATROSKA_SERVER_MEDIA_SUBSESSION_OBJS = MatroskaFileServerMediaSubsession.$(OBJ) MP3AudioMatroskaFileServerMediaSubsession.$(OBJ) 
MATROSKA_RTSP_SERVER_OBJS = MatroskaFileServerDemux.$(OBJ) $(MATROSKA_SERVER_MEDIA_SUBSESSION_OBJS) 
MATROSKA_OBJS = $(MATROSKA_FILE_OBJS) $(MATROSKA_RTSP_SERVER_OBJS) 

OGG_FILE_OBJS = OggFile.$(OBJ) OggFileParser.$(OBJ) OggDemuxedTrack.$(OBJ) 
OGG_SERVER_MEDIA_SUBSESSION_OBJS = OggFileServerMediaSubsession.$(OBJ) 
OGG_RTSP_SERVER_OBJS = OggFileServerDemux.$(OBJ) $(OGG_SERVER_MEDIA_SUBSESSION_OBJS) 
OGG_OBJS = $(OGG_FILE_OBJS) $(OGG_RTSP_SERVER_OBJS) 

MISC_OBJS = BitVector.$(OBJ) StreamParser.$(OBJ) DigestAuthentication.$(OBJ) ourMD5.$(OBJ) Base64.$(OBJ) Locale.$(OBJ) 

LIVEMEDIA_LIB_OBJS = Media.$(OBJ) $(MISC_SOURCE_OBJS) $(MISC_SINK_OBJS) $(MISC_FILTER_OBJS) $(RTP_OBJS) $(RTCP_OBJS) $(GENERIC_MEDIA_SERVER_OBJS) $(RTSP_OBJS) $(SIP_OBJS) $(SESSION_OBJS) $(QUICKTIME_OBJS) $(AVI_OBJS) $(TRANSPORT_STREAM_TRICK_PLAY_OBJS) $(MATROSKA_OBJS) $(OGG_OBJS) $(MISC_OBJS) 

$(LIVEMEDIA_LIB): $(LIVEMEDIA_LIB_OBJS) \ 
    $(PLATFORM_SPECIFIC_LIB_OBJS) 
    $(LIBRARY_LINK)[email protected] $(LIBRARY_LINK_OPTS) \ 
     $(LIVEMEDIA_LIB_OBJS) 

Media.$(CPP):  include/Media.hh 
include/Media.hh: include/liveMedia_version.hh 
MediaSource.$(CPP): include/MediaSource.hh 
include/MediaSource.hh:  include/Media.hh 
FramedSource.$(CPP): include/FramedSource.hh 
include/FramedSource.hh: include/MediaSource.hh 

...snip... 

ourMD5.$(CPP): include/ourMD5.hh 
Base64.$(CPP): include/Base64.hh 
Locale.$(CPP): include/Locale.hh 

include/liveMedia.hh:: include/MPEG1or2AudioRTPSink.hh ...snip... include/VP9VideoRTPSource.hh 

include/liveMedia.hh:: include/MPEG2TransportStreamFromPESSource.hh ...snip... include/RTSPRegisterSender.hh 

include/liveMedia.hh:: include/RTSPServerSupportingHTTPStreaming.hh ...snip... include/ProxyServerMediaSession.hh 

clean: 
    -rm -rf *.$(OBJ) $(ALL) core *.core *~ include/*~ 

install: install1 $(INSTALL2) 
install1: $(LIVEMEDIA_LIB) 
    install -d $(DESTDIR)$(PREFIX)/include/liveMedia $(DESTDIR)$(LIBDIR) 
    install -m 644 include/*.hh $(DESTDIR)$(PREFIX)/include/liveMedia 
    install -m 644 $(LIVEMEDIA_LIB) $(DESTDIR)$(LIBDIR) 
install_shared_libraries: $(LIVEMEDIA_LIB) 
    ln -fs $(NAME).$(LIB_SUFFIX) $(DESTDIR)$(LIBDIR)/$(NAME).$(SHORT_LIB_SUFFIX) 
    ln -fs $(NAME).$(LIB_SUFFIX) $(DESTDIR)$(LIBDIR)/$(NAME).so 

##### Any additional, platform-specific rules come here: 
+0

*十個遞歸級別?當您嘗試從命令行編譯一個源文件(即沒有Make)時會發生什麼?當你編寫一個調用'clock_gettime(...)'的'HelloWorld'時會發生什麼? – Beta

+0

我曾經警告過Elbonian Code Slaves ...這很棘手,因爲編譯時沒有來自低層的所有選項,這意味着GCC使用PC上的本地庫,它不需要'-lrt'標誌。我可以單獨編譯整個livemedia代碼庫,而不用交叉編譯。我的makefile kung-fu不夠強大,無法調用編譯單個文件的調用,而是使用交叉編譯選項來傳遞鏈。 –

+0

你不能從輸出中選擇調用嗎?你的sed-fu怎麼樣? – Beta

回答

1

您已經添加-lrt - 顯然還-Wl,--verbose - 到COMPILE_OPTS的定義 。這是行不通的,因爲$(COMPILE_OPTS) 只傳遞給編譯器的調用,並且-lrt是一個鏈接器 選項,您必須將它傳遞給調用鏈接器,因爲它具有任何 效果。

COMPILE_OPTS定義中刪除-lrt並將其添加到LIBRARY_LINK_OPTS的 定義。

(同樣適用於-Wl,--verbose,雖然你有可能只 介紹它進行調試。您很清楚,-Wl,選項意味着 通選項通過對連接,但該指令是寫給 海合會/ g ++工具驅動程序,並且當它調用鏈接程序, 時,它不會在調用編譯器時生效因此,由於使用-v選項,但沒有詳細的鏈接程序輸出,因此您有詳細的編譯器輸出 。

+0

我很高興,你認爲我*清楚地知道*任何東西......不幸的是,現在已經開始使用現有的代碼庫,並且對於makefiles的工作經驗很少,而且這個代碼庫不是一個溫和的介紹。我會提出你的建議。 –

+0

感謝您的幫助,您的意見使我更清楚我應該看什麼,最終我得到了frickin的東西來編譯。 –

相關問題