2

我正在使用几年来开发的大型 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[program::Grid::SaveToJPG(char const *, int, bool, bool) const]+0x4b5): undefined reference to `jpeg_CreateCompress(jpeg_compress_struct*, int, unsigned long)'

我试过的:

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

外部“C”{
#include“jpeglib.h”}

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

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

  • 我还在我的编译器选项列表中添加了:-lstdc++(来自另一个旧论坛帖子的建议)。它的影响为零。

我所做的一个奇怪的观察是,当我对整个代码(不同目录中的几个库)进行“制作”时,除非我专门进入它的目录并在那里“制作”,否则 jpeg 库不会制作。正如我所说,代码太大,无法发布以证明我没有路径错误。我很确定我没有,但这种行为似乎很奇怪。

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

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

CC = g++

选项 = -O3 -fpermissive -w -DSAMG_UNIX_LINUX -DSAMG_LCASE_USCORE -DNDEBUG -DCSP_WITH_SAMG_SOLVER

编辑 2:斯文斯建议的结果

我做了:

查找 /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':权限被拒绝 me@login1:/data/place/number/account/program/support_libraries/jpeg> cd ../../libraries/me@login1:/data/place /number/account/program/libraries> find $HOME -iname libjpeg*so*

如果我的理解是正确的,那么该库存在并且已在我期望的“库”目录中找到。我链接所有库的主生成文件具有指向 jpeg 库所在目录的包含路径。找到该目录中的其他库。“权限被拒绝”在做什么?

编辑 3:Sven 建议更改生成文件选项的结果:

这是我更改的内容:

  • 首先将“-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):在

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

Grid.cpp:(.text._ZNK3program20GridIdE9SaveToJPGEPKcibb[program::Grid::SaveToJPG(char const*, int, bool, bool) const]+0x499): 未定义引用`jpeg_std_error(jpeg_error_mgr*)'

等等...

4

1 回答 1

7

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

find $HOME -iname libjpeg\*so\*

找到您需要链接到的 libjpeg。这个命令很可能会产生几个结果。

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

如果它根本没有提供任何输出,则说明您的家中没有安装 libjpeg。所以要么

  • 安装 libjpeg

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

  • 扩大您的搜索范围,

find /usr /opt -iname libjpeg\*so\*

...并尝试在系统上安装 libjpeg 之一。

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

尝试追加

/usr/lib/libjpeg.so.62

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

-L/usr/lib -ljpeg

(由垫编辑:)

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

(由 Mats 结束编辑)

于 2013-07-16T18:01:24.430 回答