12

私は他のトピックをgrepしますが、それらは私を助けません=(。私の作業サーバーでは、sudo特権がないので、PBをインストールします

./configure --prefix = / home / username / local

次に、「person」の例を使用してソースファイルを作成し、protocを使用して正常にコンパイルします。

私はpkg-info=(を持っていません。私はそれをコンパイルしようとします

g ++ -I / home / username / local / include -L / home / username / local / lib -lprotobuf -lpthread main.cpp person.pb.cc

そして、10億の類似したエラーがあります。

person.pb.cc:(。text+0x4cf): `google :: protobuf :: internal ::kEmptyString'への未定義の参照

リンクの問題だと思いますが、どうやって解決したらいいのでしょうか?

echo $ LD_LIBRARY_PATH / home / username / local / lib

main.cppで:

#include "person.pb.h"
...

ありがとう。

4

3 に答える 3

22

ライブラリを最後に配置します。

g ++ -I / home / username / local / include -L / home / username / local / lib main.cpp person.pb.cc -lprotobuf -pthread

GCCリンクオプションから:

-llibrary
-lライブラリ
    リンク時にlibraryという名前のライブラリを検索します。
    (別の引数としてライブラリを使用する2番目の選択肢
    POSIX準拠のみであり、お勧めしません。)

    コマンドのどこにこのオプションを書くかによって違いが生じます。
    リンカは、ライブラリとオブジェクトファイルを検索して処理します。
    それらが指定されている順序。
    したがって、 `foo.o -lz bar.o'はファイルfoo.oの後にライブラリ`z'を検索しますが、
    bar.oの前。bar.oが`z'の関数を参照している場合、それらの関数
    ロードされない場合があります。

また、as-pthreadの代わりにプリプロセッサとリンカのフラグを設定するために使用します。-lpthread-pthread

于 2012-05-01T20:57:27.967 に答える
2

ライブラリリンクフラグは、コンパイラの引数の最後にあります。

g ++ -I / home / username / local / include -L / home / username / local / lib main.cpp person.pb.cc -lprotobuf -lpthread

于 2012-05-01T20:57:37.910 に答える
0

また、protobufのリンクだけでなく、他のライブラリにも当てはまる非常に一般的な問題があります。それが私の問題だったので、私はここに解決策を置きます、多分誰かがそれが役に立つと思うでしょう。

同じABIを持つライブラリにリンクしようとしていることを確認してください。C++ABIはGCC4.7.0で変更されました。したがって、GCC <4.7.0でコンパイルされたライブラリ(私の場合のようにパッケージリポジトリからパッケージをフェッチする場合はprotobufになる可能性があります)をGCC>4.7.0でコンパイルされたライブラリにリンクすることはできません。

この問題は、プランティリンケージがstd::basic_stringとstd::listについて不平を言うことで認識される可能性があります。これは、C++で最も顕著なABIの変更であったためです。私のリンカーの悲鳴は次のようになりました。

    /bincrafters/stable/package/c0c1ef10e3d0ded44179e28b669d6aed0277ca6a/lib  -L/home/adam/.conan/data/libpcap/1.8.1/bincrafters/stable/package/0a813c597d519ec14c71192b99d7de0a92bbc1c3/lib  -L/home/adam/.conan/data/zmq/4.2.2/bincrafters/stable/package/0144a3b0aceb8edb5e63295c432a8de8020ab1b7/lib  -L/home/adam/.conan/data/libsodium/1.0.16/bincrafters/stable/package/db2ca884c9793e0b0fb54ec3f846326d1addacc8/lib -Wl,-rpath,/hoar, std::char_traits<char>, std::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)'
CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o: In function `tutorial::Person_PhoneNumber::InternalSerializeWithCachedSizesToArray(unsigned char*) const':
/home/adam/.conan/data/protobuf/3.9.1/bincrafters/stable/package/053ea29eb0edc6b1695c893b738a971110c756fd/include/google/protobuf/wire_format_lite.h:1673: undefined reference to `google::protobuf::io::CodedOutputStream::WriteStringWithSizeToArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned char*)'
/home/adam/.conan/data/protobuf/3.9.1/bincrafters/stable/package/053ea29eb0edc6b1695c893b738a971110c756fd/include/google/protobuf/wire_format_lite.h:1673: undefined reference to `google::protobuf::io::CodedOutputStream::WriteStringWithSizeToArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned char*)'
CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o: In function `google::protobuf::internal::GetEmptyStringAlreadyInited[abi:cxx11]()':
/home/adam/.conan/data/protobuf/3.9.1/bincrafters/stable/package/053ea29eb0edc6b1695c893b738a971110c756fd/include/google/protobuf/message_lite.h:153: undefined reference to `google::protobuf::internal::fixed_address_empty_string[abi:cxx11]'
CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o: In function `google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
/home/adam/.conan/data/protobuf/3.9.1/bincrafters/stable/package/053ea29eb0edc6b1695c893b738a971110c756fd/include/google/protobuf/wire_format_lite.h:880: undefined reference to `google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)'
CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial11AddressBookE[_ZTVN8tutorial11AddressBookE]+0x20): undefined reference to `google::protobuf::Message::GetTypeName[abi:cxx11]() const'
CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial11AddressBookE[_ZTVN8tutorial11AddressBookE]+0x58): undefined reference to `google::protobuf::Message::InitializationErrorString[abi:cxx11]() const'
CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial6PersonE[_ZTVN8tutorial6PersonE]+0x20): undefined reference to `google::protobuf::Message::GetTypeName[abi:cxx11]() const'
CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial6PersonE[_ZTVN8tutorial6PersonE]+0x58): undefined reference to `google::protobuf::Message::InitializationErrorString[abi:cxx11]() const'
CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial18Person_PhoneNumberE[_ZTVN8tutorial18Person_PhoneNumberE]+0x20): undefined reference to `google::protobuf::Message::GetTypeName[abi:cxx11]() const'
make[2]: *** [bin/N

conanのプロファイルを定義し、同じバージョンのC ++ ABIでコンパイルされたライブラリとリンクした後、この問題は解消されました。

于 2019-12-07T15:48:41.987 に答える