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 tojpeg_std_error(jpeg_error_mgr*)" Grid.cpp :( text._ZNK3program20GridIdE9SaveToJPGEPKcibb [程序::网格:: SaveToJPG(字符常量.*,int,bool,bool)const] + 0x4b5):未定义的引用`jpeg_CreateCompress(jpeg_compress_struct*,int,unsigned long)'
我尝试过的:
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选项的结果:
这是我改变的:
-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*)"
等等...
跟进评论:你确定你安装了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结束编辑)