2012-03-01 40 views
7

Tôi gặp lỗi liên kết dưới cmake mà tôi không có khi biên dịch trên hệ thống có phiên bản gcc cũ hơn.Tham chiếu không xác định đối với clock_gettime, gcc 4.6 & cmake

Lỗi cụ thể là "không xác định tham chiếu đến clock_gettime" nhưng -lrt xuất hiện trên dòng lệnh.

phiên bản gcc của tôi:

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. 

phiên bản cmake 2.8.5

tôi bao gồm các yêu cầu "-lrt" qua target_link_libraries trong tập tin CMakeLists.txt tôi. Tôi có thể thấy nó xuất hiện trong dòng trình biên dịch bằng cách thực hiện VERBOSE = 1

Tôi đã đọc rằng gcc 4.6 là lựa chọn về vị trí của thư viện liên kết trên dòng lệnh.

Tôi làm cách nào để khắc phục điều này cho CMake?

EDIT: liên kết dòng

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' 

Tại sao ../lib/libLibUtil.a xuất hiện sau khi -lrt LibUtil (những gì sẽ libLibUtil.a) là trước khi rt?

CMakeLists.txt bao gồm ...

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

Cố gắng đưa '-lrt' thêm vào cuối danh sách các thư viện. Và hiển thị cho chúng tôi lệnh liên kết chính xác –

+0

@BasileStarynkevitch - được cập nhật. – Matt

Trả lời

8

Bạn nên đảm bảo rằng -lpthread -lrt xuất hiện sau thư viện của bạn như ../lib/libLibUtil.a

+0

Tôi biết đó là vấn đề. Nhưng làm thế nào để ép buộc cmake làm cho điều đó xảy ra? – Matt

+1

Ok, tệ của tôi. Tôi đã biên soạn một bản sao của dự án chứ không phải bản sao tôi đã chỉnh sửa! thực sự, di chuyển rt sau khi libutil sửa nó. – Matt

+0

Thật kỳ lạ, tại sao gcc 4.6 lại có sự cầu kỳ này? – Matt

Các vấn đề liên quan