链接Linux gcc上的错误4.3.4:与"jpeg"库相关的"未定义引用"(例如,未定义引用`jpeg_std_error(jpeg_error_mgr*)')

Ant*_*Ant 2 c++ linux macos linker cluster-computing

我正在使用已经开发了几年的大型C++代码.我已添加到代码中并已在Mac OX 10.7.5上成功运行它.但是,它非常慢,我现在想在集群上运行它(g ++(SUSE Linux)4.3.4 [gcc-4_3-branch revision 152973]).就C++而言,我不是很有经验,就处理编译/链接而言,我是一个完整的新手.

我无法通过与"jpeg"库相关的链接错误,并且非常感谢任何帮助.我将库代码安装在我的代码所在的目录中,但我的理解是它也可以从编译器获得.

有很多错误输出,所以我不会发布它.这是第一部分:

/data/place/number/account/program/libraries/libfile_intel.a(Grid.o):在功能program::Grid<double>::SaveToJPG(char const*, int, bool, bool) const': Grid.cpp:(.text._ZNK3program20GridIdE9SaveToJPGEPKcibb[program::Grid<double>::SaveToJPG(char const*, int, bool, bool) const]+0x499): undefined reference to jpeg_std_error(jpeg_error_mgr*)" Grid.cpp :( text._ZNK3program20GridIdE9SaveToJPGEPKcibb [程序::网格:: SaveToJPG(字符常量.*,int,bool,bool)const] + 0x4b5):未定义的引用`jpeg_CreateCompress(jpeg_compress_struct*,int,unsigned long)'

我尝试过的:

  • 当我在Google上搜索这个问题时,我从旧的论坛帖子中发现jpeg库在C中编译.这显然会导致C++编译器弄乱名称.我不清楚这意味着什么,但我按照建议添加:

extern"C"{
#include"jpeglib.h"}

在我的jpeg目录中包含"#include"jpeglib.h的所有文件中."我写道,"jpeglib.h"因为,正如我所提到的,我有一个包含jpeg代码的目录.但是,我也尝试过使用默认提供的jpeg代码,我收到一条消息,说它在集群编译器上不可用.

  • 在我的makefile中,我检查了所有包含和路径.这些似乎不是问题.此外,我有类似的路径,包括在其他目录中的其他库,他们很好.

  • 我还在我的编译器选项列表中添加了:-lstdc ++(来自另一个旧论坛帖子的建议).它没有效果.

我做的一个奇怪的观察是,当我"完成"整个代码(各个目录中的几个库)时,jpeg库不会生成,除非我专门进入其目录并在那里"make".正如我所说,代码太大了,不能发布这个来证明我没有路径错误.我很确定我没有,但这种行为似乎很奇怪.

如果有人在这篇长篇文章后仍然和我在一起,我将非常感谢任何提示.谢谢.

编辑:在我的makefile中,这是我编译/链接的内容:

CC = g ++

OPTIONS = -O3 -fpermissive -w -DSAMG_UNIX_LINUX -DSAMG_LCASE_USCORE -DNDEBUG -DCSP_WITH_SAMG_SOLVER

编辑2:Svens建议的结果

我做了:

找/ usr/opt -iname libjpeg*so*

得到了:

/usr/lib/libjpeg.so.62

/usr/lib/libjpeg.so.62.0.0

/usr/lib64/libjpeg.so.62

/usr/lib64/libjpeg.so.62.0.0

/usr/lib64/libjpeg.so找到:

/usr/lib64/mozilla': Permission denied find: / usr/lpp/mmfs/gui/runtime':权限被拒绝@ login1:/ data/place/number/account/program/support_libraries/jpeg> cd ../../libraries/ me @ login1:/ data/place/number/account/program/libraries> find $ HOME -iname libjpeg*so*

如果我的理解是正确的,那么库就存在并且已经在"libraries"目录中找到了,这是我所期望的.我链接所有库的主要makefile有一个包含jpeg库所在目录的包含路径.找到该目录中的其他库.什么是"拒绝许可"呢?

编辑3:Sven建议改变makefile选项的结果:

这是我改变的:

  • 首先将"-lgems3k -L/usr/lib -ljpeg"添加到我的LIBS(库)中.这导致下面的错误.
  • 然后加入(导致相同的错误原):OPTIONS = -O3 -fpermissive -w -DSAMG_UNIX_LINUX -DSAMG_LCASE_USCORE -DNDEBUG -DCSP_WITH_SAMG_SOLVER - /usr/lib中/ libjpeg.so.62

-L/usr/lib -ljpeg /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld:

搜索-lm时跳过不兼容的/usr/lib/libm.so

/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld:

搜索-lm时跳过不兼容的/usr/lib/libm.a

/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld:

搜索-lc时跳过不兼容的/usr/lib/libc.so

/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld:

搜索-lc时跳过不兼容的/usr/lib/libc.a

/data/place/number/account/program/libraries/lib1_intel.a(Grid.o):In

函数`program :: Grid :: SaveToJPG(char const*,int,bool,bool)const':

Grid.cpp :( text._ZNK3program20GridIdE9SaveToJPGEPKcibb [程序::网格:: SaveToJPG(字符常量*,整型,布尔,布尔)常量] + 0x499):未定义参考`jpeg_std_error(jpeg_error_mgr*)"

等等...

Sve*_*ven 6

跟进评论:你确定你安装了libjpeg吗?跑

find $HOME -iname libjpeg\*so\*
Run Code Online (Sandbox Code Playgroud)

找到你需要链接的libjpeg.此命令很可能会产生多个结果.

您可以简单地获取此输出的第一行并将其附加到编译命令,但省略上面建议的"-ljpeg".

如果它根本不提供任何输出,则表示您的家中没有安装libjpeg.所以要么

  • 安装libjpeg

  • 如果您不需要它,则禁用需要它的部分代码

  • 扩展你的搜索,

喜欢

find /usr /opt -iname libjpeg\*so\*
Run Code Online (Sandbox Code Playgroud)

...并尝试使用系统上的一个libjpeg安装.

编辑(在系统上找到libjpeg之后):

尝试追加

/usr/lib/libjpeg.so.62
Run Code Online (Sandbox Code Playgroud)

到编译命令(Makefile中的OPTIONS变量).如果这不起作用,请尝试

-L/usr/lib -ljpeg
Run Code Online (Sandbox Code Playgroud)

(由Mats编辑:)

还要确保每个地方都#include "jpeglib.h"被覆盖extern "C" { ... }.用c ++包装器替换它们可能是有意义的,它extern "C" { ... }在一个地方添加,然后在相关位置包含"wrapped_jpeglib.h".

(由Mats结束编辑)