CLion在运行可执行文件时找不到共享库

4

我正在进行一个项目。到目前为止,我一直使用简单的编辑器和自己的Makefile来构建它。不过我想要转换到CLion。

根据这个问题,你可以告诉CMake来运行你的Makefile。所以我的CMake.txt看起来像这样:

cmake_minimum_required(VERSION 3.6)
project(rekotrans_testbed_simulator)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

add_custom_target(rekotrans_testbed_simulator COMMAND make -C ${rekotrans_testbed_simulator_SOURCE_DIR} CLION_EXE_DIR=${PROJECT_BINARY_DIR})

它可以正常构建。我还设置了工作目录并指向正确的可执行文件。

在我的项目中,我使用 cppunit 1.13 进行测试。但是它找不到共享库:

/home/kunterbunt/dev/comnets/git-repository/rekotrans-testbed-simulator/rekotrans-testbed-simulator-tests: error while loading shared libraries: libcppunit-1.13.so.0: cannot open shared object file: No such file or directory

LD_LIBRARY_PATH 指向

echo $LD_LIBRARY_PATH 

/usr/local/lib

/usr/local/lib 包含这个库:

ls /usr/local/lib/

libcppunit-1.13.so.0@  libcppunit-1.13.so.0.0.2*  libcppunit.a  libcppunit.la*  libcppunit.so@  pkgconfig/

ldd 显示如下内容:

ldd /home/kunterbunt/dev/comnets/git-repository/rekotrans-testbed-simulator/rekotrans-testbed-simulator-tests

linux-vdso.so.1 (0x00007ffc257e8000)
libboost_thread.so.1.63.0 => /usr/lib/libboost_thread.so.1.63.0 (0x00007f1c73254000)
libboost_system.so.1.63.0 => /usr/lib/libboost_system.so.1.63.0 (0x00007f1c73050000)
libboost_date_time.so.1.63.0 => /usr/lib/libboost_date_time.so.1.63.0 (0x00007f1c72e3f000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f1c72c22000)
libboost_program_options.so.1.63.0 => /usr/lib/libboost_program_options.so.1.63.0 (0x00007f1c729a4000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f1c727a0000)
libcppunit-1.13.so.0 => /usr/local/lib/libcppunit-1.13.so.0 (0x00007f1c72563000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f1c721db000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f1c71ed7000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f1c71cc0000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f1c71922000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007f1c7171a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1c7347c000)

那么为什么CLion找不到它呢?如果我从控制台运行二进制文件,一切都能正常工作。

编辑以显示ldd输出。 - kunterbunt
我猜测在CLion中LD_LIBRARY_PATH没有设置为程序。请问在CLion内部的终端中执行echo $LD_LIBRARY_PATH命令会输出什么? - oLen
还会打印“/usr/local/lib”。 - kunterbunt
哦,没错,那也可以。所以从 GUI 打开时,它会作为另一个没有设置该变量的用户打开? - kunterbunt
显然...如果方便的话,您可以编辑.profile来在每次登录图形会话时设置变量。 - oLen
显示剩余2条评论
3个回答

6
请看如何在Linux中设置环境变量LD_LIBRARY_PATH
如果您将自定义库路径添加到LD配置中,则CLion会自动找到您的库,无需将它们添加到运行配置中。
在Ubuntu/Debian上,您可以通过创建新的.conf文件来配置LD。
sudo nano /etc/ld.so.conf.d/myLocalLibs.conf

这只是包含您库路径的简单路径:/usr/local/lib。最后,调用。

sudo ldconfig

更新LD配置。

请注意,在某些系统(Ubuntu/Debian)中,您无法在/etc/profile或/etc/environment中设置LD_LIBRARY_PATH:

自Ubuntu 9.04 Jaunty Jackalope以来,无法在$HOME/.profile、/etc/profile或/etc/environment文件中设置LD_LIBRARY_PATH。您必须使用/etc/ld.so.conf.d/*.conf配置文件。有关更多信息,请参见Launchpad bug #366728help.ubuntu.com)。


4
正如oLen正确指出的那样,通过GUI(在我的情况下是Gnome)启动CLion时,它似乎不会作为我的用户启动。我不知道它以什么身份启动,但在/etc/profile中设置LD_LIBRARY_PATH=/usr/local/lib并重新启动(或重新加载资源),它就可以工作了 - 简而言之,无论哪个用户运行CLion,该变量都未被设置。

另一种方法是Run -> Edit Configurations -> (select your application) -> Environment variables。在这里,您可以手动将LD_LIBRARY_PATH设置为您需要的任何内容,在我的情况下为/usr/local/lib


1
作为替代方案,您可以前往“运行 -> 编辑配置 -> 模板”,选择“CMake应用程序”(和/或“Google测试”),并将“环境变量:”设置为:Environment variables:
LD_LIBRARY_PATH=/usr/local/gcc-latest/lib64

从现在开始创建的任何新应用程序都将继承这些设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接