2012-03-01 13 views
7

Ho un errore di collegamento in cmake che non ho durante la compilazione su un sistema con una versione precedente di gcc.Riferimento non definito a clock_gettime, gcc 4.6 & cmake

L'errore specifico è "riferimento non definito a clock_gettime" ma -lrt viene visualizzato sulla riga di comando.

La mia versione di gcc:

gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 
Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

versione 2.8.5 cmake

sto tra cui il "-lrt" necessaria attraverso target_link_libraries nel mio file CMakeLists.txt. Posso vederlo apparire nella riga del compilatore con make VERBOSE = 1

Ho letto che gcc 4.6 è schizzinoso circa la posizione delle librerie di collegamenti sulla riga di comando.

Come posso risolvere questo problema per CMake?

EDIT: linea di collegamento

Linking CXX executable ../bin/obbsd 
cd /home/matt/Desktop/Matt/OBBS/Build/server && /usr/bin/cmake -E cmake_link_script \ 
    CMakeFiles/obbsd.dir/link.txt --verbose=1 
/usr/bin/c++ -g CMakeFiles/obbsd.dir/Block.cpp.o \ 
    CMakeFiles/obbsd.dir/BlockFileCache.cpp.o \ 
     CMakeFiles/obbsd.dir/BlockFileStore.cpp.o \ 
     CMakeFiles/obbsd.dir/BlockMemoryCache.cpp.o \ 
     CMakeFiles/obbsd.dir/BlockStore.cpp.o CMakeFiles/obbsd.dir/Config.cpp.o \ 
     CMakeFiles/obbsd.dir/DeleteBlockSession.cpp.o \ 
     CMakeFiles/obbsd.dir/mConfigFile.cpp.o \ 
     CMakeFiles/obbsd.dir/mNetworkPacketReader.cpp.o \ 
     CMakeFiles/obbsd.dir/mNetworkPacketWriter.cpp.o \ 
     CMakeFiles/obbsd.dir/obbsd.cpp.o \ 
     CMakeFiles/obbsd.dir/ReadBlockSession.cpp.o CMakeFiles/obbsd.dir/Server.cpp.o \ 
     CMakeFiles/obbsd.dir/Session.cpp.o CMakeFiles/obbsd.dir/Utility.cpp.o \ 
     CMakeFiles/obbsd.dir/WriteBlockSession.cpp.o -o ../bin/obbsd -rdynamic \ 
     -lpthread -lrt ../lib/libLibUtil.a 
../lib/libLibUtil.a(mTimer.cpp.o): In function `mTimer::GetTick()': 
/home/matt/Desktop/Matt/OBBS/LibUtil/src/mTimer.cpp:108: undefined reference to 
    `clock_gettime' 

Perché ../lib/libLibUtil.a che appare dopo -lrt quando LibUtil (quello che sarebbe libLibUtil.a) è prima di rt?

CMakeLists.txt comprende ...

... 
add_executable(obbsd ${SERVER_SOURCE_FILES}) 
find_package(Threads REQUIRED) 
target_link_libraries(obbsd ${CMAKE_THREAD_LIBS_INIT} LibUtil rt) 
+2

Prova a mettere '-lrt' aggiungere alla fine della vostra lista delle librerie. E mostraci il comando di collegamento esatto –

+0

@BasileStarynkevitch - aggiornato. – Matt

risposta

8

È necessario assicurarsi che -lpthread -lrt appaiono dopo le librerie come ../lib/libLibUtil.a

+0

So che questo è il problema. Ma come faccio a forzare la cmake affinché ciò accada? – Matt

+1

Ok, mio ​​male. Stavo compilando una copia del progetto, non quella che stavo modificando! in effetti, lo spostamento dopo la libutil l'ha risolto. – Matt

+0

Stranamente, perché gcc 4.6 ha questa pignoleria? – Matt

Problemi correlati