2012-05-14 12 views
6

私のプロジェクトには実行可能ファイルと共有ライブラリが1つあります。 共有ライブラリはブーストライブラリを使用します。実行可能ファイルは共有ライブラリolnyを使用します。Linux上のCMakeで共有ライブラリにブーストをリンクする

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

ルートcmakeのファイル:

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) 

t検定/ 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} 
      ) 

(私はいくつかの重要でないをカットしましたもの)

Windows上で

それが正常に動作します(しかし、私はCMakeのなしVisuelStudioが使用)が、Linux に私はリンクエラーを以下の取得:

../../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 

私は与えられたオプションとの組み合わせの多くを試してみたが、私はありませんでしたそれをリンクすることができます。 私はどこでミスをしたのですか?これは私がCMakeを真剣に使用した初めてのことです:)

答えて

7

CMake変数は大文字と小文字を区別し、FindBoostモジュールはではなくBOOST_LIBRARIESという変数にブーストライブラリを設定します。

2つのtarget_link_librariesコールで${BOOST_LIBRARIES}${Boost_LIBRARIES}に置き換えると、正常に動作するはずです。 FindBoostモジュールの完全な情報については

は、次のコマンドを実行します

cmake --help-module FindBoost 
+0

OK今私はすべてをコンパイルすることができます(とセグメンテーションフォールトを取得;)nerverマインド)しかし、私はt検定の実行にブーストをリンクする必要があります。共有ライブラリ内のブーストを非表示にすることは可能ですか? – Databyte

+1

あなたは何を意味するのかよく分かりません。追加ライブラリを 'tilenet'の依存性として指定すると、別のターゲットの依存関係として' tilenet'を指定するたびに、CMakeは自動的に追加ライブラリをさらなる依存関係として識別します。言い換えれば、 '$ {BOOST_LIBRARIES}'がすでに 'tilenet'を含んでいれば、他の' target_link_libraries'呼び出しに明示的にリストする必要はありません。 – Fraser

+0

okありがとうございますありがとう – Databyte

関連する問題