【问题标题】:Undefined references in building code from IPOL with libpng使用 libpng 从 IPOL 构建代码中的未定义引用
【发布时间】:2013-11-05 11:37:50
【问题描述】:

我正在尝试编译可在线获得的代码Non-Local Means Denoising

编译源码时出现以下错误,我想主要是libpng:

  g++  -L/opt/local/lib/ -L/usr/local/lib/ -L/usr/lib/x86_64-linux-gnu/ -fopenmp -lpng    
  -o nlmeans_ipol  nlmeans_ipol.o io_png.o libauxiliar.o libdenoising.o mt19937ar.o
  io_png.o: In function `io_png_write_raw':
  io_png.c:(.text+0xe0): undefined reference to `png_create_write_struct'
  io_png.c:(.text+0xf6): undefined reference to `png_create_info_struct'
  io_png.c:(.text+0x12b): undefined reference to `png_init_io'
  io_png.c:(.text+0x194): undefined reference to `png_set_IHDR'
  io_png.c:(.text+0x1a6): undefined reference to `png_write_info'
  io_png.c:(.text+0xb36): undefined reference to `png_write_image'
  io_png.c:(.text+0xb48): undefined reference to `png_write_end'
  io_png.c:(.text+0xb62): undefined reference to `png_destroy_write_struct'
  io_png.c:(.text+0xbcc): undefined reference to `png_destroy_write_struct'
  io_png.c:(.text+0xc1f): undefined reference to `png_destroy_read_struct'
  io_png.c:(.text+0xe6a): undefined reference to `png_destroy_write_struct'
  io_png.c:(.text+0xe80): undefined reference to `png_destroy_write_struct'

我遵循以下线程并将文件“libpng.a”放置在许多位置,但没有帮助。

我见过类似的libpng problem here,但没有帮助。

我使用的是 ubuntu 12.04。

谁能告诉我到底出了什么问题?

编辑 1 完整调用如下

  g++ -O3 -funroll-loops -fomit-frame-pointer  -fno-tree-pre -falign-loops -ffast-math -ftree-vectorize -Wall -Wextra -Wno-write-strings -Wno-deprecated -ansi -fopenmp   -c -o nlmeans_ipol.o nlmeans_ipol.cpp
  cc -c -o io_png.o  io_png.c -O3 -funroll-loops -fomit-frame-pointer  -fno-tree-pre -falign-loops -ffast-math -ftree-vectorize -Wall -Wextra -Wno-write-strings -ansi -I/opt/local/include/ -I/usr/local/include/   
  g++ -c -o libauxiliar.o  libauxiliar.cpp -O3 -funroll-loops -fomit-frame-pointer  -fno-tree-pre -falign-loops -ffast-math -ftree-vectorize -Wall -Wextra -Wno-write-strings -Wno-deprecated -ansi -fopenmp -I/opt/local/include/ -I/usr/local/include/ 
  g++ -c -o libdenoising.o  libdenoising.cpp -O3 -funroll-loops -fomit-frame-pointer  -fno-tree-pre -falign-loops -ffast-math -ftree-vectorize -Wall -Wextra -Wno-write-strings -Wno-deprecated -ansi -fopenmp -I/opt/local/include/ -I/usr/local/include/ 
  cc -c -o mt19937ar.o  mt19937ar.c -O3 -funroll-loops -fomit-frame-pointer  -fno-tree-pre -falign-loops -ffast-math -ftree-vectorize -Wall -Wextra -Wno-write-strings -ansi -I/opt/local/include/ -I/usr/local/include/   
  g++ -lpng -lm -fopenmp -L/opt/local/lib/ -L/usr/local/lib/ -L/usr/lib/ -L/usr/lib/x86_64-linux-gnu/ -fopenmp -lpng -lpngwriter -lz -lfreetype -o nlmeans_ipol  nlmeans_ipol.o io_png.o libauxiliar.o libdenoising.o mt19937ar.o

这是完整的调用。它是一个 make 文件,上面的转储在命令提示符处显示的副本中。

【问题讨论】:

    标签: c compilation libpng


    【解决方案1】:

    尝试仅更改 g++ 调用中的参数顺序,并在目标文件后面添加 -lpng。链接器按照给定的顺序评估参数,因此当它获得-lpng 时,它还不知道io_png.o,因此它不会从库中链接必要的代码

    编辑:

    你的makefile执行的最后一个命令是:

    g++ -lpng -lm -fopenmp -L/opt/local/lib/ -L/usr/local/lib/ -L/usr/lib/ -L/usr/lib/x86_64-linux-gnu/ -fopenmp -lpng -lpngwriter -lz -lfreetype -o nlmeans_ipol  nlmeans_ipol.o io_png.o libauxiliar.o libdenoising.o mt19937ar.o
    

    如果应该是这样的

    g++ -L/opt/local/lib/ -L/usr/local/lib/ -L/usr/lib/ -L/usr/lib/x86_64-linux-gnu/   -o nlmeans_ipol  nlmeans_ipol.o io_png.o libauxiliar.o libdenoising.o mt19937ar.o -lpng -lm -fopenmp -lpngwriter -lz -lfreetype
    

    我不知道每个库,可能-l...参数的顺序仍然不对

    【讨论】:

    • 它不起作用,以下是错误 g++:错误:nlmeans_ipol.o:没有这样的文件或目录 g++:错误:io_png.o:没有这样的文件或目录 g++:错误:libauxiliar.o : 没有这样的文件或目录 g++: 错误: libdenoising.o: 没有这样的文件或目录 g++: 错误: mt19937ar.o: 没有这样的文件或目录
    • 这些错误表明您的 .o 文件不存在。如果是这样,那么所有调用都不会成功,它们只是链接器调用,不会编译源文件。
    • 刚刚更新了调用,因为它在执行 makefile 时打印在命令提示符上
    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 2021-04-28
    • 2021-08-17
    • 2019-03-18
    • 2013-11-21
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多