2016-05-31 6 views
-2

私は別のライブラリirRNGに依存するライブラリirWGNを持っています。奇妙なエラー: `class :: class() 'への未定義の参照

私のCMakeFiles.txtは以下の通りです。一つはSRC /信号である

add_library(irRNG irRNG.cpp) 
add_library(irWGN irWGN.cpp) 

で、メインCMakeFile

include_directories(${SRC}/signals) 
SET(MY_LIB 
    ${MY_LIB} 
    irRNG 
    irWGN 
) 
.... 

foreach(file2link ${FILES_to_RUN}) 

    target_link_libraries(${file2link} 
    ${catkin_LIBRARIES} 
    ${Boost_LIBRARIES} 
    ${gsl_LIBRARIES} 
    ${OpenCV_LIBRARIES} 
    ${MY_LIB} 
    ) 
    add_dependencies(${file2link} project_generate_messages_cpp) 
endforeach(file2link) 

Amが取得このエラー

./devel/lib/libirWGN.so: undefined reference to `irRNG::irRNG()' 
../devel/lib/libirWGN.so: undefined reference to `irRNG::~irRNG()' 

奇妙なことは、私はどんなことなく、Ubuntuの12.04でこれを使用していたということです問題。今はこの問題が現れるだけです。

+0

なぜダウン投票? – Courier

+1

あなたは 'target_link_libraries()'を覚えましたか? –

+0

'add_library(irRNG irRNG)'の代わりに 'add_library(irRNG irRNG.cpp)'についてどうですか?そうであれば、CMakeがあなたが使っていたラインから理解していることは興味深いかもしれません。 – Antonio

答えて

1

問題は、あなたがあなたのirWGN irRNGに依存していることであるので、あなたの問題を解決するための最もエレガントな方法は、追加するには次のようになります。

target_link_libraries(irWGN irRNG) 

は、あなたのライブラリ間の相互依存を作成します。静的ライブラリでも動作します。したがって、実行可能ファイルをirWGNにリンクしようとすると、cmakeは自動的にirRNGに正しい順序でリンクします。

+0

これは「最もエレガントな方法」ではないことを強調したいと思います。しかし、ありがとう!実際には、注文について全く気にしないでください。あなたのライブラリ(ファイルの数)が大きくなり、あなたのソリューションを採用する際のトラブルが増えます – Courier

+0

もっとよい解決策があるべきだと思うので、あなたの解決策を確認する前に誰かが何かを提案してくるのを待つでしょう。しかし、私はあなたの解決策に投票しました。 – Courier

+0

@polarあるライブラリが別のライブラリに依存している場合、libirWGNはあなたのlibirRNGに依存しますが、どこかに記述する必要があります。そして、これは最もエレガントな方法です。あなたのライブラリを構成するファイルの数とは関係ありません。このガイドの最初の点「ライブラリターゲット名」を参照してください:https://cmake.org/cmake/help/v3.5/command/target_link_libraries.html – Antonio

関連する問題