2012-03-01 22 views
7

Tengo un error de enlace en cmake que no tengo al compilar en un sistema con una versión anterior de gcc.Referencia indefinida a clock_gettime, gcc 4.6 & cmake

El error específico es "referencia no definida a clock_gettime" pero aparece -lrt en la línea de comandos.

Mi versión de 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. 

versión 2.8.5 cmake

Estoy incluyendo la necesaria "-lrt" a través de target_link_libraries en mi archivo CMakeLists.txt. Puedo verlo aparecer en la línea del compilador con make VERBOSE = 1

He leído que gcc 4.6 es exigente con la posición de las bibliotecas de enlaces en la línea de comandos.

¿Cómo puedo solucionar esto para CMake?

EDIT: línea de Enlace

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' 

Por qué se ../lib/libLibUtil.a apareciendo después -lrt cuando libutil (lo que sería libLibUtil.a) es rt antes?

CMakeLists.txt incluye ...

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

Trate de poner '-lrt' añadir el final de la lista de bibliotecas. Y muéstranos el comando de enlace exacto –

+0

@BasileStarynkevitch - actualizado. – Matt

Respuesta

8

Debe asegurarse de que -lpthread -lrtaparecen después sus bibliotecas como ../lib/libLibUtil.a

+0

Sé que ese es el problema. Pero, ¿cómo fuerzo a cmake para que eso suceda? – Matt

+1

Ok, mi mal. ¡Estaba compilando una copia del proyecto, no la que estaba editando! de hecho, mover rt después de libutil lo arregló. – Matt

+0

Curiosamente, ¿por qué gcc 4.6 tiene esta exigencia? – Matt

Cuestiones relacionadas