Poco库链接ubuntu平台中的错误

时间:2016-05-20 11:08:26

标签: c++ linux g++ poco poco-libraries

我已经下载了最新的Poco库poco-1.7.3.tar。配置了很少的属性,并进行了安装。 尝试了以下示例helloworld程序。

#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

你能帮帮我吗?

3 个答案:

答案 0 :(得分:1)

我设法运行完全相同的代码,但使用CMake而不是Makefile,它工作。你只需根据你的机器改变路径。

这是我的CMakeLists.txt:

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}) 

干杯,

答案 1 :(得分: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

以防这些示例将来以某种方式超出范围,这里是复制的代码和makefile。

#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);

注意:请记住在makefile代码中恢复标签而不是空格!

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库中的Poco :: Logger。所以看来图书馆没有联系起来。我建议两件事: 1.检查它是否未损坏。您可以通过清理和重新编译来实现 2.尝试在标准路径中安装,以避免链接路径

我知道所有这些都不是决定性的(猜测最好),但有助于为您提供问题所在的提示。

答案 2 :(得分: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