谢谢你们在undefined reference to function回答我之前的问题。正如您所建议的那样,问题的原因并不是链接库。现在我用以下代码生成了可执行文件:(我的g ++版本和gcc是4.4.5。我使用的是Ubuntu 10.10。)
g++ -o ex_addinst ./ex_addinst.o -L/home/li/work/tools/lindo/lindoapi/bin/linux64 -m64 -llindo64 -lmosek64 -lconsub3 -lc -ldl -lm -lguide -lpthread -lsvml -limf -lirc
但是,当我使用
运行可执行文件时,会出现另一个问题./ex_addinst
出现错误:(我不确定我是否应该开始一个新问题或者当前没有......)
./ex_addinst: error while loading shared libraries: liblindo64.so.6.0: cannot open shared object file: No such file or directory
但liblindo64.so.6.0存在于lib~ / lindoapi / bin / linux64的文件夹中,其中包含以下文件:
libconsub3.so libirc.so liblindojni.so libmosek64.so.5.0 lindo.par
libguide.so liblindo64.so liblindojni.so.6.0.3 libsvml.so placeholder
libimf.so liblindo64.so.6.0 libmosek64.so lindoapivars.sh runlindo
我在liblindo.so.6.0和liblindo.so之间创建了一个符号链接:
ln -sf liblindo64.so.6.0 liblindo64.so
'-llindo64'是g ++命令,所以我认为应该链接 liblindo64.so.6.0 。 我试图将-L更改为-Llib,但没有帮助。
谁能告诉我这里有什么问题?谢谢!
答案 0 :(得分:2)
您需要在运行时链接程序的搜索路径中包含.so
文件所在的目录。
您可以通过更改LD_LIBRARY_PATH
环境变量来完成此操作:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HOME/lindoapi/bin/linux64
在启动可执行文件之前。
答案 1 :(得分:1)
如果您不打算将当前位于/home/li/work/tools/lindo/lindoapi/bin/linux64
下的库安装到系统目录(/usr/lib
,/usr/local/lib
等)中,那么最好简单地链接应用程序,以便它只会工作(TM):
gcc -o ex_addinst ./ex_addinst.o \
-L/home/li/work/tools/lindo/lindoapi/bin/linux64 \
-Wl,-rpath=/home/li/work/tools/lindo/lindoapi/bin/linux64 \
-m64 -llindo64 -lmosek64 -lconsub3 -lc -ldl \
-lm -lguide -lpthread -lsvml -limf -lirc
这总是必须设置LD_LIBRARY_PATH
,因为
LD_LIBRARY_PATH
)和LD_LIBRARY_PATH
搜索libc.so.6
等等。) LD_LIBRARY_PATH
设置不起作用的原因(对Mat的回答是评论)是您使用了HOME
的{{1}}。
答案 2 :(得分:1)
总结解决方案:
我将路径添加到〜。/ bashrc:
export LD_LIBRARY_PATH = $ {LD_LIBRARY_PATH}:$ HOME /.../ lindoapi / bin / linux64
(生成.o文件后)将目标文件链接到:
g ++ -o ex_addinst ./ex_addinst.o -L / home /.../ lindoapi / bin / linux64 -m64 -llindo64 -lmosek64 -lconsub3 -lc -ldl -lm -lguide -lpthread -lsvml -limf -lirc