C++ ubuntu平台中的Poco库链接错误

C++ ubuntu平台中的Poco库链接错误,c++,linux,g++,poco,poco-libraries,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<s

我已经下载了最新的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);
#包括
#包括
类HelloPocoApplication:publicpoco::Util::Application
{
受保护的:
虚拟int main(const std::vector和args)
{

std::cout检查Poco文档似乎应该有效。看一个例子,我怀疑你的库的顺序是颠倒的。假设路径是正确的(因为ld没有报告),我会说链接顺序是错误的。为什么。 所以我建议你把命令改为

g++-I poco-1.7.3/Util/include-I poco-1.7.3/Foundation/include-L poco-1.7.3/lib/Linux/x8664-lPocoFoundation-lpocutil 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);
更新:

综上所述,我必须指出您的错误的奇怪之处,特别是在库中找到的Poco::Logger。所以,库似乎并没有链接。我建议两件事: 1.检查其是否已损坏。您可以通过清理和重新编译来完成此操作 2.尝试在标准路径中安装,以避免链接路径


我知道所有这些都不是确定的(猜测充其量也行),但将有助于为您提供问题所在的提示。

您最初的库链接顺序很好,但您缺少XML和JSON(Util取决于这些库)但是,您所得到的链接错误表明您可能缺少基础库或混合库版本。

$ 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

我成功地运行了这段代码,但是使用了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}) 

干杯,

感谢您的回复。第一种更改链接顺序的方法报告了相同的问题。第二种方法:程序可以从中选择包含的文件,如Application.h。它报告的明显错误如下。$make'g++-lPocoFoundation-lpocutil-o hello poco hello-poco.cpp hello poco.cpp:2:35:致命错误:poco/Util/Aapplication.h:没有这样的文件或目录#include^编译已终止。make:**[hello poco]错误1查找示例使我看不到除了两个附加库以外的任何特殊之处。请参见此处。您能编译示例并查看它们是否运行正确吗?它减少了错误。但仍报告以下问题。/tmp/ccjBEy6m.o:In function
main]:helloworld.cpp:(.text+0x4f):未定义对
Poco::Util::Application::init(int,char)'helloworld.cpp:(.text+0xd9):未定义对
Poco::Logger::log(Poco::Exception const&)'/tmp/ccjBEy6m.o:函数中的Poco::RefCountedObject::release():helloworld.cpp:(.text.)(.rodata.\u ZTV20HelloPocoApplication[\u ZTV20HelloPocoApplication]+0x collect2:错误:ld返回1退出状态**您可能(a)缺少poco库,或者(b)将应用程序链接到与poco库链接的标准库不同的标准库
$ 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
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})