C++ ubuntu平台中的Poco库链接错误
我已经下载了最新的Poco库Poco-1.7.3.tar。配置了很少的属性,并进行了安装。 尝试了以下示例helloworld程序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
#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 functionmain]: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})