使用png++; 我安装了PNG++,一个用于LBPNG的包装器,它恰好是C程序(我猜),对于光线跟踪图像生成,我需要用完全用C++编写的项目使用LBPNG,所以我安装了PNG++ 2.7

使用png++; 我安装了PNG++,一个用于LBPNG的包装器,它恰好是C程序(我猜),对于光线跟踪图像生成,我需要用完全用C++编写的项目使用LBPNG,所以我安装了PNG++ 2.7 ,c++,c++11,png,fstream,C++,C++11,Png,Fstream,在上,我尝试编译该示例以检查包装器是否安装正确。下面是一段代码: pngtest.cpp #include <png++/png.hpp> #include <iostream> int main() { std::cout << "\n***********************************\n"; std::cout << "Testing libpng"; png::image< png::r

在上,我尝试编译该示例以检查包装器是否安装正确。下面是一段代码:

pngtest.cpp

#include <png++/png.hpp>
#include <iostream>

int main()
{

    std::cout << "\n***********************************\n";
    std::cout << "Testing libpng";

    png::image< png::rgb_pixel > image(640, 480);
    std::cout <<"Image width: " << image.get_width() <<"\n";
    std::cout << "Image height: " << image.get_height() <<"\n";

    for (size_t y = 0; y < image.get_height(); ++y)
    {
        for (size_t x = 0; x < image.get_width(); ++x)
        {
            //image[y][x] = png::rgb_pixel(x, y, x + y);
            // non-checking equivalent of image.set_pixel(x, y, ...);
        }
    }

    image.write("rgb.png");   
    std::cout << "\n***********************************\n";

    return 0;
}
这就是我得到的错误:

pngTest.cpp:(.text._ZN3png9info_baseC2ERNS_7io_baseEP14png_struct_def[_ZN3png9info_baseC5ERNS_7io_baseEP14png_struct_def]+0x37): undefined reference to `png_create_info_struct'
/tmp/ccgfdQ53.o: In function `png::info::write() const':
pngTest.cpp:(.text._ZNK3png4info5writeEv[_ZNK3png4info5writeEv]+0xcc): undefined reference to `png_set_PLTE'
pngTest.cpp:(.text._ZNK3png4info5writeEv[_ZNK3png4info5writeEv]+0x12d): undefined reference to `png_set_tRNS'
pngTest.cpp:(.text._ZNK3png4info5writeEv[_ZNK3png4info5writeEv]+0x148): undefined reference to `png_write_info'
/tmp/ccgfdQ53.o: In function `png::info::sync_ihdr() const':
pngTest.cpp:(.text._ZNK3png4info9sync_ihdrEv[_ZNK3png4info9sync_ihdrEv]+0x6e): undefined reference to `png_set_IHDR'
/tmp/ccgfdQ53.o: In function `png::end_info::destroy()':
pngTest.cpp:(.text._ZN3png8end_info7destroyEv[_ZN3png8end_info7destroyEv]+0x49): undefined reference to `png_destroy_info_struct'
/tmp/ccgfdQ53.o: In function `png::end_info::write() const':
pngTest.cpp:(.text._ZNK3png8end_info5writeEv[_ZNK3png8end_info5writeEv]+0x23): undefined reference to `png_write_end'
/tmp/ccgfdQ53.o: In function `png::io_base::set_swap() const':
pngTest.cpp:(.text._ZNK3png7io_base8set_swapEv[_ZNK3png7io_base8set_swapEv]+0x26): undefined reference to `png_set_swap'
/tmp/ccgfdQ53.o: In function `png::io_base::set_interlace_handling() const':
pngTest.cpp:(.text._ZNK3png7io_base22set_interlace_handlingEv[_ZNK3png7io_base22set_interlace_handlingEv]+0x26): undefined reference to `png_set_interlace_handling'
/tmp/ccgfdQ53.o: In function `png::io_base::raise_error()':
pngTest.cpp:(.text._ZN3png7io_base11raise_errorEv[_ZN3png7io_base11raise_errorEv]+0x21): undefined reference to `png_set_longjmp_fn'
/tmp/ccgfdQ53.o: In function `png::io_base::raise_error(png_struct_def*, char const*)':
pngTest.cpp:(.text._ZN3png7io_base11raise_errorEP14png_struct_defPKc[_ZN3png7io_base11raise_errorEP14png_struct_defPKc]+0x18): undefined reference to `png_get_error_ptr'
/tmp/ccgfdQ53.o: In function `png::writer<std::basic_ofstream<char, std::char_traits<char> > >::writer(std::basic_ofstream<char, std::char_traits<char> >&)':
pngTest.cpp:(.text._ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEEC2ERS4_[_ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEEC5ERS4_]+0x28): undefined reference to `png_create_write_struct'
pngTest.cpp:(.text._ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEEC2ERS4_[_ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEEC5ERS4_]+0x57): undefined reference to `png_set_write_fn'
/tmp/ccgfdQ53.o: In function `png::writer<std::basic_ofstream<char, std::char_traits<char> > >::~writer()':
pngTest.cpp:(.text._ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEED2Ev[_ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEED5Ev]+0x3b): undefined reference to `png_destroy_write_struct'
/tmp/ccgfdQ53.o: In function `png::writer<std::basic_ofstream<char, std::char_traits<char> > >::write_info() const':
pngTest.cpp:(.text._ZNK3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10write_infoEv[_ZNK3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10write_infoEv]+0x24): undefined reference to `png_set_longjmp_fn'
/tmp/ccgfdQ53.o: In function `png::writer<std::basic_ofstream<char, std::char_traits<char> > >::write_row(unsigned char*)':
pngTest.cpp:(.text._ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE9write_rowEPh[_ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE9write_rowEPh]+0x28): undefined reference to `png_set_longjmp_fn'
pngTest.cpp:(.text._ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE9write_rowEPh[_ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE9write_rowEPh]+0x83): undefined reference to `png_write_row'
/tmp/ccgfdQ53.o: In function `png::writer<std::basic_ofstream<char, std::char_traits<char> > >::write_end_info() const':
pngTest.cpp:(.text._ZNK3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE14write_end_infoEv[_ZNK3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE14write_end_infoEv]+0x24): undefined reference to `png_set_longjmp_fn'
/tmp/ccgfdQ53.o: In function `png::writer<std::basic_ofstream<char, std::char_traits<char> > >::write_data(png_struct_def*, unsigned char*, unsigned long)':
pngTest.cpp:(.text._ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10write_dataEP14png_struct_defPhm[_ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10write_dataEP14png_struct_defPhm]+0x1d): undefined reference to `png_get_error_ptr'
pngTest.cpp:(.text._ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10write_dataEP14png_struct_defPhm[_ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10write_dataEP14png_struct_defPhm]+0x41): undefined reference to `png_get_io_ptr'
/tmp/ccgfdQ53.o: In function `png::writer<std::basic_ofstream<char, std::char_traits<char> > >::flush_data(png_struct_def*)':
pngTest.cpp:(.text._ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10flush_dataEP14png_struct_def[_ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10flush_dataEP14png_struct_def]+0x15): undefined reference to `png_get_error_ptr'
pngTest.cpp:(.text._ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10flush_dataEP14png_struct_def[_ZN3png6writerISt14basic_ofstreamIcSt11char_traitsIcEEE10flush_dataEP14png_struct_def]+0x39): undefined reference to `png_get_io_ptr'
collect2: error: ld returned 1 exit status
pngTest.cpp:(.text."ZN3png9info_baseC2ERNS_7io_baseEP14png_struct_def["ZN3png9info_baseC5ERNS_7io_baseEP14png_struct_def]+0x37):对“png_create_info_struct”的未定义引用
/tmp/ccgfdQ53.o:在函数“png::info::write()const”中:
pngTest.cpp:(.text.ZNK3png4info5writeEv[ZNK3png4info5writeEv]+0xcc):未定义对“png\u set\u PLTE”的引用
pngTest.cpp:(.text.ZNK3png4info5writeEv[ZNK3png4info5writeEv]+0x12d):未定义对“png\u set\u tRNS”的引用
pngTest.cpp:(.text._ZNK3png4info5writeEv[_ZNK3png4info5writeEv]+0x148):未定义对“png_write_info”的引用
/tmp/ccgfdQ53.o:在函数“png::info::sync_ihdr()const”中:
pngTest.cpp:(.text._ZNK3png4info9sync_ihdrEv[_ZNK3png4info9sync_ihdrEv]+0x6e):未定义对“png_set_IHDR”的引用
/tmp/ccgfdQ53.o:在函数“png::end_info::destroy()”中:
pngTest.cpp:(.text._ZN3png8end_info7destroyEv[_ZN3png8end_info7destroyEv]+0x49):对“png_destroy_info结构”的未定义引用
/tmp/ccgfdQ53.o:在函数“png::end_info::write()const”中:
pngTest.cpp:(.text._ZNK3png8end_info5writeEv[_ZNK3png8end_info5writeEv]+0x23):未定义对“png_write_end”的引用
/tmp/ccgfdQ53.o:在函数'png::io_base::set_swap()const'中:
pngTest.cpp:(.text._ZNK3png7io_base8set_swapEv[_ZNK3png7io_base8set_swapEv]+0x26):未定义对“png_set_swapEv”的引用
/tmp/ccgfdQ53.o:在函数'png::io_base::set_interlace_handling()const'中:
pngTest.cpp:(.text._ZNK3png7io_base22set_interlace_handlingEv[_ZNK3png7io_base22set_interlace_handlingEv]+0x26):未定义对“png_set_interlace_handlingEv”的引用
/tmp/ccgfdQ53.o:在函数'png::io_base::raise_error()'中:
pngTest.cpp:(.text._ZN3png7io_base11raise_errorEv[_ZN3png7io_base11raise_errorEv]+0x21):对“png_set_longjmp_fn”的未定义引用
/tmp/ccgfdQ53.o:在函数“png::io_base::raise_error(png_struct_def*,char const*)”中:
pngTest.cpp:(.text."ZN3png7io_base11raise_errorEP14png_struct_defPKc["ZN3png7io_base11raise_errorEP14png_struct_defPKc]+0x18):未定义对“png_get_error_ptr”的引用
/tmp/ccgfdQ53.o:在函数“png::writer::writer(std::basic_of stream&)”中:
pngTest.cpp:(.text.ZN3png6writerISt14basic_of StreamicsT11Char_traitsIcEEEC2ERS4)[ZN3png6writerISt14basic_of StreamicsT11Char_traitsIcEEEC5ERS4][0x28]未定义对“png_创建_写入结构”的引用
pngTest.cpp:(.text.ZN3png6writerISt14basic_of StreamicsT11Char_traitsIcEEEC2ERS4)[ZN3png6writerISt14basic_of StreamicsT11Char_traitsIcEEEC5ERS4_x57]:未定义对“png_set_write_fn”的引用
/tmp/ccgfdQ53.o:在函数“png::writer::~writer()”中:
pngTest.cpp:(.text.ZN3png6writerISt14basic_of StreamicsT11Char_TraitsCeed2ev)[_ZN3png6writerISt14basic_of StreamicsT11Char_TraitsCeed5ev]+0x3b):对“png_destroy_write_structure”的未定义引用
/tmp/ccgfdQ53.o:在函数“png::writer::write_info()const”中:
pngTest.cpp:(.text.znk3png6writerist11char_traitsIcEEE10write_infoEv)[znk3png6writerist11char_traitsIcEEE10write_infoEv]+0x24]:未定义对“png_set_longjmp”的引用
/tmp/ccgfdQ53.o:在函数“png::writer::write_row(unsigned char*)”中:
pngTest.cpp:(.text.zn3png6writerist11char_traitsIcEEE9write_rowEPh)[zn3png6writerist11char_traitsIcEEE9write_rowEPh]的基本_+0x28]:未定义对“png_set_longjmp_fn”的引用
pngTest.cpp:(.text.ZN3png6writerISt14basic_of StreamicsT11Char_-TraitsIee9Write_-rowEPh[ZN3png6writerISt14basic_of StreamicsT11Char_-TraitsIee9Write_-rowEPh]+0x83):未定义对“png_-write_-rowEPh”的引用
/tmp/ccgfdQ53.o:在函数'png::writer::write_end_info()const'中:
pngTest.cpp:(.text.znk3png6writerist11char_traitsIcEEE14write_end_infoEv)[znk3png6writerist11char_traitsIcEEE14write_end_infoEv][0x24]:未定义对“png_set_longjmp_fn”的引用
/tmp/ccgfdQ53.o:在函数“png::writer::write_data(png_struct_def*,unsigned char*,unsigned long)”中:
pngTest.cpp:(.text."ZN3png6writerISt14basic_of Streamics11Char_traitsIcEEE10write_dataEP14png_struct_defPhm["ZN3png6writerISt14basic_of Streamics11Char_traitsIcEEE10write_dataEP14png_struct_defPhm][0x1d]:未定义对“png_get_error_ptr”的引用
pngTest.cpp:(.text."zn3png6writerist11char_traitscee10write_dataEP14png_struct_defPhm["zn3png6writerist11char_traitscee10write_dataEP14png_struct_defPhm][0x41]:对“png_get_io_ptr”的未定义引用
/tmp/ccgfdQ53.o:在函数“png::writer::flush_data(png_struct_def*)”中:
pngTest.cpp:(.text.zn3png6writerist11char\u traitsIcEEE10flush\u dataEP14png\u struct\u def["zn3png6writerist11char\u traitsIcEEE10flush\u dataEP14png\u struct\u def]未定义对“png\u get\u error\u ptr”的引用
pngTest.cpp:(.text."zn3png6writerist11char\u traitsIcEEE10flush\u dataEP14png\u struct\u def["zn3png6writerist11char\u traitsIcEEE10flush\u dataEP14png\u struct\u def]+0x39):未定义对“png\u get\u io\u ptr”的引用
collect2:错误:ld返回了1个退出状态

谁能告诉我哪里出了问题。我使用的是Ubuntu 16.04 LTS,系统上安装的libpng版本是1.6,这是一个愚蠢的错误,为链接器使用了错误的标志

正确的编译命令应为:

g++  pngTest.cpp `libpng-config --ldflags` -o pngTest.out

正如@Galik在评论中指出的,链接器是
-cflags
而不是
-ldflags

libpng config--cflags返回什么?可能还有另一个链接器标志选项。您需要从链接的说明页面添加链接标志:
`libpng config--ldflags`
Hi
g++  pngTest.cpp `libpng-config --ldflags` -o pngTest.out