2016-12-08 4 views
2

CMakeを使用してprotobufライブラリをリンクできません。私CMakeListsはCMakeはGoogle Protobufで動作しません

cmake_minimum_required(VERSION 3.6) 
project(addressbook) 

set(CMAKE_CXX_STANDARD 11) 
set(PROJECT_NAME addressbook) 

ADD_SUBDIRECTORY(proto) 

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) 
ADD_EXECUTABLE(main main.cpp) 
TARGET_LINK_LIBRARIES(main proto ${PROTOBUF_LIBRARY}) 

で、プロトサブディレクトリに

INCLUDE(FindProtobuf) 
FIND_PACKAGE(Protobuf REQUIRED) 
INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIR}) 
PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_HEADER message.proto) 
ADD_LIBRARY(proto ${PROTO_HEADER} ${PROTO_SRC}) 

しかし、私のIDEはまだ

ような行のブーフを出力し、他のCMakeLists.txt( https://github.com/shaochuan/cmake-protobuf-exampleが、それはGitHubのレポで行われている方法)があります

CMakeFiles/main.dir/main.cpp.o:関数main': /home/camille/ClionProjects/protobuf/main.cpp:42: undefined reference to google :: protobuf :: internal :: VerifyVersion(int、int、char const *) ' /home/camille/ClionProjects/protob UF/main.cppに:49:未定義の参照 グーグルtutorial::AddressBook::AddressBook()' /home/camille/ClionProjects/protobuf/main.cpp:54: undefined reference toへ::いるProtobuf ::メッセージ:: ParseFromIstream(STD ::はistream *「)

私のミスですか?私はそれをどのように機能させるのですか?

答えて

2

target_link_librariesに渡す必要がある変数はProtobuf_LIBRARIESです。 documentationを参照してください。

2

${PROTOBUF_LIBRARY}がトップレベルCMakeLists.txtの範囲で空であるため、プログラムがリンクできません。これは、add_subdirectoryを呼び出すと子スコープが作成され、find_package(Protobuf REQUIRED)で設定されたProtobuf_XXX変数がその子スコープ内にのみ存在するためです。

この問題を解決するための良い方法はproto/CMakeLists.txtに以下を追加することです:

target_link_libraries(proto INTERFACE ${Protobuf_LIBRARIES}) 

これも${Protobuf_LIBRARIES}にリンクするprotoにリンクターゲットに指示します。今、あなたはあなたのトップレベルCMakeLists.txttarget_link_librariesを簡素化することができます:サイドノートで

target_link_libraries(addressbook proto) 

、あなたはまた、例えば使用することができます

target_link_libraries(${PROJECT_NAME} INTERFACE ...) 

${PROJECT_NAME}は、あなたがそのCMakeLists.txtファイルにproject(...)文で設定されているものは何でも解決します。

最後に、PROTOBUF_LIBRARYの代わりにProtobuf_LIBRARIESにリンクすることに注意してください。 Protobuf_LIBRARIESには、プロトコルバッファライブラリと依存するPthreadsライブラリの両方が含まれています。

0

変数名の場合には注意してください:CMakeの3.6以降では、FindProtobufモジュールの入力と出力の変数はすべてのようにCMakeの3.6とProtobuf_作品を使用して、(release notesを参照)Protobuf_PROTOBUF_から名前が変更されましたが、との未定義参照して失敗します以前のバージョン。

のいずれか、安全側に古いスタイル

target_link_libraries(${PROJECT_NAME} INTERFACE ${PROTOBUF_LIBRARIES})) 

または少なくともCMakeの3を使用するすべての人を強制的に使用するには。6

cmake_minimum_required(VERSION 3.6) 

また、このような問題を診断する方法の詳細情報をKitware cmakeの問題追跡中resolved bug reportがあります。

関連する問題