2012-05-14 38 views
6

tôi có một thư viện được chia sẻ và một thư viện được chia sẻ trong dự án của mình. Thư viện được chia sẻ sử dụng thư viện tăng cường. tệp thực thi sử dụng olny thư viện được chia sẻ.Liên kết với thư viện được chia sẻ với CMake trên Linux

tilenet/    <-- Project 
    ttest/   <-- Test (executable) 
     CMakeLists.txt 
    tilenet/   <-- The shared library 
     CMakeLists.txt 
    CMakeLists.txt <-- Root CMake-file 

gốc cmake-file:

cmake_minimum_required(VERSION 2.6) 

project(tilenet) 

set(Boost_USE_STATIC_LIBS  OFF) # I've already tried ON 
set(Boost_USE_MULTITHREADED  ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 


find_package(Boost 1.49 COMPONENTS system filesystem REQUIRED) 

include_directories(${Boost_INCLUDE_DIRS}) 

add_subdirectory(test) 
add_subdirectory(tilenet) 

Hàm TTEST/CMakeLists.txt

add_executable(ttest test.cpp) 
target_link_libraries(ttest tilenet ${BOOST_LIBRARIES}) 

tilenet/CMakeLists.txt

include_directories("include") 
set(tilenet_src "src/tilenet.cpp" ...) 

add_library(tilenet SHARED ${tilenet_src}) 
target_link_libraries(tilenet 
      ${SFML_LIBRARIES} 
      ${BOOST_LIBRARIES} 
      ) 

(Tôi đã cắt giảm một số không quan trọng công cụ)

Trên cửa sổ nó hoạt động tốt (nhưng có tôi sử dụng VisuelStudio mà không CMake), nhưng trên linux tôi nhận được sau lỗi liên kết:

../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path_traits::convert(wchar_t const*, wchar_t const*, std::string&, std::codecvt<wchar_t, char, __mbstate_t> const&)' 
../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path::operator/=(boost::filesystem3::path const&)' 
../../lib/libtilenet.so: undefined reference to `boost::system::system_category()' 
../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path::wchar_t_codecvt_facet()' 
../../lib/libtilenet.so: undefined reference to `boost::system::generic_category()' 
../../lib/libtilenet.so: undefined reference to `boost::filesystem3::path_traits::convert(char const*, char const*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&, std::codecvt<wchar_t, char, __mbstate_t> const&)' 
collect2: error: ld returned 1 exit status 
make[2]: *** [../bin/ttest] Error 1 
make[1]: *** [test/CMakeFiles/ttest.dir/all] Error 2 
make: *** [all] Error 2 

Tôi đã thử rất nhiều sự kết hợp với các tùy chọn đưa ra nhưng tôi đã không có thể liên kết nó. Bạn có biết tôi đã phạm sai lầm ở đâu không? Đây là lần đầu tiên tôi sử dụng CMake nghiêm túc :)

Trả lời

7

Biến CMake phân biệt chữ hoa chữ thường và mô-đun FindBoost đặt thư viện tăng thành biến có tên Boost_LIBRARIES, chứ không phải BOOST_LIBRARIES.

Nếu bạn thay thế ${BOOST_LIBRARIES} bằng ${Boost_LIBRARIES} trong hai cuộc gọi target_link_libraries và cuộc gọi của bạn sẽ hoạt động chính xác.

Đối với thông tin đầy đủ về các mô-đun FindBoost, chạy:

cmake --help-module FindBoost 
+0

ok bây giờ tôi có thể biên dịch tất cả mọi thứ (và nhận được một lỗi segmentation;) Nerver tâm) nhưng tôi phải liên kết động lực để thực thi Hàm TTEST. Có thể ẩn tăng cường bên trong thư viện được chia sẻ không? – Databyte

+1

Không chắc chắn ý của bạn là gì. Khi bạn đã chỉ định các lib tăng cường như là một phụ thuộc của 'tilenet', bất cứ khi nào bạn chỉ định' tilenet' làm phụ thuộc của một mục tiêu khác, CMake sẽ tự động xác định libs tăng thêm là phụ thuộc. Nói cách khác, không cần liệt kê rõ ràng '$ {BOOST_LIBRARIES}' trong một lệnh 'target_link_libraries' khác nếu nó đã chứa' tilenet'. – Fraser

+0

ok âm thanh cảm ơn bạn – Databyte

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