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 :)
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
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
ok âm thanh cảm ơn bạn – Databyte