2016-04-19 3 views
1

この問題に関する多くのSOの質問を読んだ後、私はそれを動作させることができませんでした。私は、boost_1_60_0をダウンロードした後、私はそれを作成するためのコマンドを実行しました:Ubuntu x64のBoostとのリンク

sudo ./bootstrp.sh --prefix=/home/ricardo/boostlib 
sudo ./b2 install -j8 

は、私もこのようなb2を実行してみました:

sudo ./b2 install -j8 architecture=x86 address-model=64 

は関係ありません。エラーは常に同じです:

main.cpp:(.text+0x7e): undefined reference to `boost::system::generic_category()' 
main.cpp:(.text+0x8a): undefined reference to `boost::system::generic_category()' 
main.cpp:(.text+0x96): undefined reference to `boost::system::system_category()' 

ええ、私は知っています。リンクエラー。-lboost_systemとすべてで実行する必要があります。はい、-L/home/ricardo/boostlib/libを入力してください。知っている。

これは私のcmakeのは、次のようになります。

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -L/home/ricardo/boostlib/lib -lboost_system -Wl,--verbose") 

include_directories("/home/ricardo/boostlib/include") 

あなたは尋ねるかもしれない:-Wl,--verboseの出力は何ですか?驚くべきことに、libboost_system.soが見つかりました。

attempt to open /home/ricardo/boostlib/lib/libboost_system.so succeeded 
-lboost_system (/home/ricardo/boostlib/lib/libboost_system.so) 

大丈夫です。図書館が見つかりました。私はまだいくつかの選択肢を見つけることを試みている、何もこれまで動作するようです。だから、私はそれをブーストとリンクしていて、boost_systemが見つかったとしても、プログラムはまだコンパイルされません...なぜですか?誰かが私を説明できますか?

編集:How to link C++ program with Boost using CMakeが動作しているようです。なぜ私の方法がうまくいかないのか知りたいのですが、CMakeとMakeを使わずにg ++コンパイラだけを使ってboostにリンクしたいときはどうすればいいですか?私はOpenblasとのリンクを正常に行うことができたので、なぜBoostと連携していないのだろうかと思います。

Edit2:これは私がmake VERBOSE=1を実行した後に得たg ++コマンドで、ソースが依存関係の後に置かれていることがわかりました。

-std=c++11 -L/home/ricardo/boostlib/lib -lboost_system CMakeFiles/prophet-service.dir/main.cpp.o -o prophet-service -rdynamic 

そして、これは私の現在のcmakeのファイルです:

cmake_minimum_required(VERSION 3.2) 
project(prophet-service) 
set(SOURCE_FILES 
    main.cpp) 
include_directories("/home/ricardo/boostlib/include") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -L/home/ricardo/boostlib/lib -lboost_system") 
add_executable(prophet-service ${SOURCE_FILES}) 

また、私はlibbost_system.aファイルを持っていないようです。少なくとも今私は.soファイルの代わりに.aファイルが必要であることを知っています。

+0

VERBOSE = 1 – xaxxon

+0

リンカからフルリンクライン出力を投稿してください '.a'のファイルが必要です。私は私のUbuntuのオペレーティングシステム上でlibboost_system.aを検索する場合

は例えば、私は次のよう見つけます'.so'ファイルではありません。システムにロケートがインストールされている場合は、 'locate libboost_system.a'を実行して見つけてください。 – kenba

+0

cxxflagsは通常コンパイルのためにリンクするために、ldflagsのようなものを使う方が良いでしょう。 –

答えて

1

正しい順序でリンクしていますか?依存関係を維持することは、依存関係を前提としている必要があります。

+0

うーん、そうだと思います。私は今は分かりません。私はMakeがシーンの裏で何をしているのか見ようとしますが、それは意味をなさないでしょう。 –

+1

VERBOSEを1にすると、 – xaxxon

+0

リンカのコマンドラインを取得できますか? – xaxxon

0

ライブラリのバージョンを拡張子.aにリンクする必要があります。これは、リンカーにはこの拡張子(静的ライブラリ用)が必要であり、共有ライブラリ用の.so(Windowsの場合はdllと同じ)が必要なためです。

[email protected]:~$ locate libboost_system.a 
/home/frar/Documents/SVILUPPO/boost_1_59_0/bin.v2/libs/system/build/gcc-4.8/release/link-static/threading-multi/libboost_system.a 
/home/frar/Documents/SVILUPPO/boost_1_59_0/stage/lib/libboost_system.a 
/usr/lib/x86_64-linux-gnu/libboost_system.a 
関連する問題