2016-05-20 4 views
1

最新のPocoライブラリpoco-1.7.3.tarをダウンロードしました。少数のプロパティで構成され、インストールが完了しました。 次のサンプルのhelloworldプログラムを試してみてください。ubuntuプラットフォームのPocoライブラリリンクエラー

#include <iostream> 
#include <Poco/Util/Application.h> 

class HelloPocoApplication : public Poco::Util::Application 
{ 
protected: 
    virtual int main(const std::vector<std::string> &args) 
    { 
      std::cout << "Hello, POCO C++ Libraries!" << std::endl; 

      return EXIT_OK; 
    } 
}; 
POCO_APP_MAIN(HelloPocoApplication); 

g++ -I poco-1.7.3/Util/include -I poco-1.7.3/XML/include -I poco-1.7.3/JSON/include -I poco-1.7.3/Foundation/include -L poco-1.7.3/lib/Linux/x86_64 -lPocoUtil -lPocoFoundation -lPocoXML -lPocoJSON helloworld.cpp -o prog

を使用してコンパイルされた。しかし、それは

/tmp/ccFvl4ll.o: In function `main': 
helloworld.cpp:(.text+0x4f): undefined reference to  `Poco::Util::Application::init(int, char**)' 
     helloworld.cpp:(.text+0xd9): undefined reference to `Poco::Logger::log(Poco::Exception const&)' 
    /tmp/ccFvl4ll.o: In function `Poco::RefCountedObject::release() const': 
    helloworld.cpp:(.text._ZNK4Poco16RefCountedObject7releaseEv[_ZNK4Poco16RefCountedObject7releaseEv]+0x6e): undefined reference to `Poco::Bugcheck::unexpected(char const*, int)' 
    /tmp/ccFvl4ll.o: In function `Poco::Util::Application::logger() const': 
    helloworld.cpp:(.text._ZNK4Poco4Util11Application6loggerEv[_ZNK4Poco4Util11Application6loggerEv]+0x2c): undefined reference to `Poco::Bugcheck::nullPointer(char const*, char const*, int)' 
    /tmp/ccFvl4ll.o: In function `HelloPocoApplication::HelloPocoApplication()': 
    helloworld.cpp:(.text._ZN20HelloPocoApplicationC2Ev[_ZN20HelloPocoApplicationC5Ev]+0x14): undefined reference to `Poco::Util::Application::Application()' 
    /tmp/ccFvl4ll.o:(.gcc_except_table+0x2c): undefined reference to `typeinfo for Poco::Exception' 
    /tmp/ccFvl4ll.o: In function `Poco::AutoPtr<HelloPocoApplication>::operator->()': 
    helloworld.cpp:(.text._ZN4Poco7AutoPtrI20HelloPocoApplicationEptEv[_ZN4Poco7AutoPtrI20HelloPocoApplicationEptEv]+0x3a): undefined reference to `Poco::NullPointerException::NullPointerException(int)' 
    helloworld.cpp:(.text._ZN4Poco7AutoPtrI20HelloPocoApplicationEptEv[_ZN4Poco7AutoPtrI20HelloPocoApplicationEptEv]+0x3f): undefined reference to `Poco::NullPointerException::~NullPointerException()' 
    helloworld.cpp:(.text._ZN4Poco7AutoPtrI20HelloPocoApplicationEptEv[_ZN4Poco7AutoPtrI20HelloPocoApplicationEptEv]+0x44): undefined reference to `typeinfo for Poco::NullPointerException' 
    /tmp/ccFvl4ll.o:(.rodata._ZTV20HelloPocoApplication[_ZTV20HelloPocoApplication]+0x20): undefined reference to `Poco::Util::Application::name() const' 
    /tmp/ccFvl4ll.o:(.rodata._ZTV20HelloPocoApplication[_ZTV20HelloPocoApplication]+0x28): undefined reference to `Poco::Util::Application::initialize(Poco::Util::Application&)' 
    /tmp/ccFvl4ll.o:(.rodata._ZTV20HelloPocoApplication[_ZTV20HelloPocoApplication]+0x30): undefined reference to `Poco::Util::Application::uninitialize()' 
    /tmp/ccFvl4ll.o:(.rodata._ZTV20HelloPocoApplication[_ZTV20HelloPocoApplication]+0x38): undefined reference to `Poco::Util::Application::reinitialize(Poco::Util::Application&)' 
    /tmp/ccFvl4ll.o:(.rodata._ZTV20HelloPocoApplication[_ZTV20HelloPocoApplication]+0x40): undefined reference to `Poco::Util::Application::defineOptions(Poco::Util::OptionSet&)' 
    /tmp/ccFvl4ll.o:(.rodata._ZTV20HelloPocoApplication[_ZTV20HelloPocoApplication]+0x48): undefined reference to `Poco::Util::Application::run()' 
    /tmp/ccFvl4ll.o:(.rodata._ZTV20HelloPocoApplication[_ZTV20HelloPocoApplication]+0x50): undefined reference to `Poco::Util::Application::handleOption(std::string const&, std::string const&)' 
    /tmp/ccFvl4ll.o: In function `HelloPocoApplication::~HelloPocoApplication()': 
    helloworld.cpp:(.text._ZN20HelloPocoApplicationD2Ev[_ZN20HelloPocoApplicationD5Ev]+0x1f): undefined reference to `Poco::Util::Application::~Application()' 
    /tmp/ccFvl4ll.o:(.rodata._ZTI20HelloPocoApplication[_ZTI20HelloPocoApplication]+0x10): undefined reference to `typeinfo for Poco::Util::Application' 
    collect2: error: ld returned 1 exit status 

次のエラーを投げているあなたは私を助けてくださいことはできますか?

答えて

0

Pocoドキュメントで確認するとうまくいくようです。例hereとそのmakefileを見ると、あなたのライブラリの順序が逆転していると思われます。パスが正しいと仮定すると(ldはそれについて報告していないので)、リンク順序が正しくないと言います。 See hereなぜですか。 これらの例は、将来的に何らかの形でスコープ外になる場合にはだから私はあなたが

g++ -I poco-1.7.3/Util/include -I poco-1.7.3/Foundation/include -L poco-1.7.3/lib/Linux/x86_64 -lPocoFoundation -lPocoUtil helloworld.cpp -o prog

にあなたのコマンドを変更する提案、ここでコピーしたコードとメイクファイルです。

#include <iostream> 
#include <Poco/Util/Application.h> 

class HelloPocoApplication : public Poco::Util::Application 
{ 
protected: 
    virtual int main(const std::vector<std::string> &args) 
    { 
     std::cout << "Hello, POCO C++ Libraries!" << std::endl; 

     return EXIT_OK; 
    } 
}; 

POCO_APP_MAIN(HelloPocoApplication); 

注:は、メイクファイルのコード内のスペースの代わりにタブを復元することを忘れないでください!

POCO_LIBS=-lPocoFoundation -lPocoUtil 

all: hello-poco 

clean: 
    rm -f hello-poco 

hello-poco: hello-poco.cpp 
    $(CXX) $(POCO_LIBS) -o hello-poco hello-poco.cpp 

更新:上記のすべてで

は、私はあなたのエラー特にポコ::ロガーfoundationライブラリに発見されたの奇妙さにノートを置くために持っている、と述べました。だから、ライブラリはリンクされていないようです。私は2つのことを提案します: 1.壊れていないかどうかを確認します。あなたは、洗浄して、リンクのパス私が知っている

を避けるように、標準のパスにインストールする 2.トライを再コンパイルすることで、これらすべては決定的ではありません(推測で最高の作品)が、あなたのヒントを提供するために有用であろうことを行うことができます問題はある。

+0

ありがとう:

は、ここに私のCMakeLists.txtです。リンクの順序を変更する最初の方法は、同じ問題を報告しました。 – Kranthi

+0

2番目の方法:プログラムからApplication.hのようなインクルードファイルを選択できる場所。明らかなエラーを次のように報告しています。 ** '$ make' g ++ -lPocoFoundation -lPocoUtil -o hello-poco hello-poco.cpp hello-poco。cpp:2:35:致命的なエラー:Poco/Util/Application.h:そのようなファイルやディレクトリがありません。 #include ^ コンパイルが終了しました。 make:*** [hello-poco]エラー1 ** – Kranthi

+0

サンプルを見ると、2つの追加のライブラリに特有のものは表示されません。それをここで見てください。 https://github.com/pocoproject/poco/blob/develop/Util/samples/SampleApp/Makefile サンプルをコンパイルして、それらが正しく実行されているかどうかを確認できますか? –

0

オリジナルのライブラリのリンク順序は問題ありませんでしたが、XMLとJSONが残っています(Utilはこれらのライブラリに依存しています)。あなたが持っているリンクエラーは、Foundationライブラリがないか、ライブラリのバージョンが混在している可能性があることを示しています。

$ echo $POCO_BASE 
/tmp/poco 
$ pwd 
/tmp/poco/test 
$ g++ -I $POCO_BASE/Util/include -I $POCO_BASE/Foundation/include -L $POCO_BASE/lib/Linux/x86_64 -lPocoUtil -lPocoXML -lPocoJSON -lPocoFoundation helloworld.cpp -o prog 
+0

これはエラーを減らしました。しかし、依然として以下の問題を報告している。 **/tmp/ccjBEy6m.o: 'main '関数内: helloworld.cpp :(。テキスト+ 0x4f):' Poco :: Util :: Application :: init(int、char **)'への未定義参照 'Poco :: Logger :: log(Poco :: Exception const&) 'への未定義の参照 /tmp/ccjBEy6m.o:関数' Poco :: RefCountedObject :: release()で、 CONST ': helloworld.cpp :(text._ZNK4Poco16RefCountedObject7releaseEv [_ZNK4Poco16RefCou(.rodata._ZTV20HelloPocoApplication [_ZTV20HelloPocoApplication] + 0xの collect2は:エラー:ldはあなたが(a)は行方不明POCOライブラリ、または(どちらかである – Kranthi

+0

** 1つの終了ステータスを返しましたb)pocoライブラリがリンクされているライブラリとは別の標準ライブラリにアプリケーションをリンクする – Alex

1

私は正確にそのコードを実行するために管理が、CMakeのではなく、Makefileを使用して、それが働きました。あなたのマシンに応じてパスを変更するだけです。

cmake_minimum_required(VERSION 2.8.3) 
project(tutocpp14) 

set(Poco_DIR "/usr/local/lib/cmake/Poco/") 
set(Poco_INCLUDE_DIRS "/usr/include/Poco/") 

find_package(Poco REQUIRED COMPONENTS Foundation Net XML Util) # add other components here 

# check c++11/c++0x 
include(CheckCXXCompilerFlag) 
CHECK_CXX_COMPILER_FLAG("-std=c++11 " COMPILER_SUPPORTS_CXX11) 
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) 
if(COMPILER_SUPPORTS_CXX11) 
    set(CMAKE_CXX_FLAGS "-std=c++11") 
elseif(COMPILER_SUPPORTS_CXX0X) 
    set(CMAKE_CXX_FLAGS "-std=c++0x") 
else() 
    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") 
endif() 

include_directories(${Poco_INCLUDE_DIRS}) 

add_executable(publisher src/publisher.cpp) 
target_link_libraries(publisher ${Poco_LIBRARIES}) 

乾杯、返信用