2012-08-02 451 views
0

我想了解我的cmake安裝程序出了什麼問題。我下載了http://alexott.net/en/cpp/BoostAsioProxy.html中描述的代碼。這是一個使用boost的異步HTTP代理服務器。嘗試使用cmake編譯代碼時未定義的引用

這是我的CMakeLists.txt的內容:

cmake_minimum_required(VERSION 2.4) 
PROJECT(asio-proxy-async) 

# Usage: 
# cmake . -DCMAKE_INCLUDE_PATH=~/exp/include -DCMAKE_LIBRARY_PATH=~/exp/lib 
# 

SET(CMAKE_VERBOSE_MAKEFILE ON) 

SET (CMAKE_MODULE_PATH ${cpptests_SOURCE_DIR}/cmake CACHE PATH "local cmake") 

ADD_DEFINITIONS(-g -Wall -ansi -Wno-deprecated) 

SET(Boost_USE_STATIC_LIBS OFF) 
SET(Boost_USE_MULTITHREAD ON) 
FIND_PACKAGE(Boost 1.49.0 REQUIRED COMPONENTS filesystem system thread regex) 
MESSAGE(STATUS "** Boost Include: ${Boost_INCLUDE_DIR}") 
MESSAGE(STATUS "** Boost Libraries: ${Boost_LIBRARIES}") 
IF(Boost_FOUND) 
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) 
     LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) 
ENDIF(Boost_FOUND) 

SET(USED_LIBS ${Boost_SYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY} ${Boost_REGEX_LIBRARY}) 

ADD_EXECUTABLE(asio-proxy-async proxy.cpp proxy-server.cpp proxy-conn.cpp) 
TARGET_LINK_LIBRARIES(asio-proxy-async ${USED_LIBS}) 

後,我的cmake型。 3個源文件編譯剛剛確定,但隨後在鏈接階段,我得到這個:

Linking CXX executable asio-proxy-async 
/usr/bin/cmake -E cmake_link_script CMakeFiles/asio-proxy-async.dir/link.txt --verbose=1 
/usr/bin/c++  CMakeFiles/asio-proxy-async.dir/proxy.o CMakeFiles/asio-proxy-async.dir/proxy-server.o CMakeFiles/asio-proxy-async.dir/proxy-conn.o -o asio-proxy-async -rdynamic -lboost_system-mt -lboost_thread-mt -lboost_regex-mt 
CMakeFiles/asio-proxy-async.dir/proxy.o: In function `__static_initialization_and_destruction_0': 
/usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()' 
/usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()' 
/usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()' 
CMakeFiles/asio-proxy-async.dir/proxy.o: In function `error_code': 
/usr/local/include/boost/system/error_code.hpp:315: undefined reference to `boost::system::system_category()' 
CMakeFiles/asio-proxy-async.dir/proxy.o: In function `boost::asio::error::get_system_category()': 
/usr/local/include/boost/asio/error.hpp:216: undefined reference to `boost::system::system_category()' 
CMakeFiles/asio-proxy-async.dir/proxy.o: In function `thread_exception': 
/usr/local/include/boost/thread/exceptions.hpp:49: undefined reference to `boost::system::system_category()' 
CMakeFiles/asio-proxy-async.dir/proxy.o: In function `condition_error': 
/usr/local/include/boost/thread/exceptions.hpp:82: undefined reference to `boost::system::system_category()' 
CMakeFiles/asio-proxy-async.dir/proxy-server.o: In function `__static_initialization_and_destruction_0': 
/usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()' 
/usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()' 
/usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()' 
CMakeFiles/asio-proxy-async.dir/proxy-conn.o: In function `__static_initialization_and_destruction_0': 
/usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()' 
/usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()' 
/usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()' 
collect2: ld returned 1 exit status 
make[2]: *** [asio-proxy-async] Error 1 
make[2]: Leaving directory `/home/nelsonrp/workspace/boost-test/asio-proxy-async' 
make[1]: *** [CMakeFiles/asio-proxy-async.dir/all] Error 2 
make[1]: Leaving directory `/home/nelsonrp/workspace/boost-test/asio-proxy-async' 
make: *** [all] Error 2 

我在SO談論這種用CMake和提升,沒有任何問題,看到一對夫婦的帖子在這裏儘管他們有最終答案。爲了澄清事情有點多,我只想指出,如果我做的:

g++ -g -Wall -c proxy.cpp 
g++ -g -Wall -c proxy-conn.cpp 
g++ -g -Wall -c proxy-server.cpp 
g++ proxy.o proxy-server.o proxy-conn.o -o asio-proxy-async -lboost_system -lboost_thread -lboost_regex -lboost_filesystem 

的源代碼編譯就好了,這意味着我已經安裝了提升,這是在正確的地方,這個問題似乎只是與cmake一起。有什麼建議麼?

回答

1

頁面上提供的源代碼歸檔附帶了其自己的過期版本的FindBoost.cmake模塊。刪除過期的模塊文件,其路徑爲asio-proxy-async/cmake/FindBoost.cmake,然後重新創建生成文件夾並再次運行cmake。這將使CMake使用標準的FindBoost模塊,在找到您現有的Boost安裝時應該沒有問題。

+0

謝謝sakra!剛剛做到了 – Bilthon 2012-08-03 03:47:47

相關問題