相关疑难解决方法(0)

ld找不到现有的库

我试图在这个Debian lenny系统上将应用程序与g ++链接起来.ld抱怨它无法找到指定的库.这里的具体示例是ImageMagick,但我也遇到了类似的问题.

我正在调用链接器:

g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic
Run Code Online (Sandbox Code Playgroud)

ld抱怨:

/usr/bin/ld: cannot find -lmagic
Run Code Online (Sandbox Code Playgroud)

然而,libmagic存在:

$ locate libmagic.so
/usr/lib/libmagic.so.1
/usr/lib/libmagic.so.1.0.0
$ ls -all /usr/lib/libmagic.so.1*
lrwxrwxrwx 1 root root    17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
-rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0
$ ldd /usr/lib/libmagic.so.1.0.0 
    linux-gate.so.1 =>  (0xb7f85000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
    /lib/ld-linux.so.2 (0xb7f86000)
$ sudo ldconfig -v | grep "libmagic"
    libmagic.so.1 -> libmagic.so.1.0.0
Run Code Online (Sandbox Code Playgroud)

我如何进一步诊断这个问题,哪些可能是错的?我做的事情完全是愚蠢的吗?

linux linker gcc shared-libraries shared-objects

163
推荐指数
5
解决办法
59万
查看次数

如何在不使用LD_LIBRARY_PATH的情况下链接makefile中特定版本的共享库?

我知道LD_LIBRARY_PATH是邪恶的,避免使用它是一个好习惯.我有一个server.c远程Solaris 9服务器上的程序,它包含两个版本的openssl库(0.9.8和1.0.0),我使用的是gcc 3.4.6.我的程序需要链接到1.0.0a版本.因为它是工作环境,所以我无权修改openssl库目录中的任何内容.我想出用两个-L-R选项编译我的程序而没有设置LD_LIBRARY_PATH,它工作正常.(我注意到没有设置-R选项它将无法工作)但编译后的程序保持链接/usr/local/ssl/lib/libssl.so.0.9.8而不是/.../libssl.so.1.0.0.有解决办法吗?

顺便说一句,如果我错了,请纠正我:是否-R在运行时实际"链接"共享库并且-L选项仅在编译时"加载"共享库?

任何帮助都感激不尽!

Z.Zen

//////////////////////////////////////////////

这是我的Makefile:

CC = gcc
OPENSSLDIR = /usr/local/ssl
CFLAGS = -g -Wall -W -I${OPENSSLDIR}/include -O2 -D_REENTRANT -D__EXTENSIONS__ 

RPATH = -R${OPENSSLDIR}/lib
LD = ${RPATH} -L${OPENSSLDIR}/lib -lssl -lcrypto -lsocket -lnsl -lpthread

OBJS = common.o

PROGS = server

all: ${PROGS}

server: server.o ${OBJS}
        ${CC} server.o ${OBJS} -o server ${LD}


clean:;
        ${RM} ${PROGS} *.ln *.BAK *.bak …
Run Code Online (Sandbox Code Playgroud)

c gcc openssl shared-libraries

9
推荐指数
1
解决办法
2万
查看次数

使用pprof和gperftools会导致卷曲错误

所以我一直在做以下事情:

$ pprof /bin/ls ls.prof
Using local file /bin/ls.
Gathering CPU profile from http://ls.prof/pprof/profile?seconds=30 for 30 seconds to
  /home/user/csteifel/pprof/ls.1414597606.ls.prof
Be patient...

curl: (7) couldn't connect to host
Failed to get profile: curl 'http://ls.prof/pprof/profile?seconds=30' > /home/user/csteifel/pprof/.tmp.ls.1414597606.ls.prof: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我不确定这里是什么,因为这是他们在这里展示的一个例子:http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html

现在我明白ls实际上不会有信息,但我也知道它不应该给我一个关于curl的错误,在这种情况下它应该是别的东西.我在这做错了什么?

我也尝试过这样做我创建的示例程序(例如:pprof --callgrind /home/user/csteifel/testing2/X86_64_DEBUG/el6/wtf ~/testing2/prof.out > callgrind.out我得到一个类似的错误:

Using local file /home/user/csteifel/testing2/X86_64_DEBUG/el6/wtf.
Use of uninitialized value $host in substitution (s///) at /home/user/csteifel/usr/local/lib/bin/pprof line 3195.
Use of uninitialized value $hostport in concatenation (.) or …
Run Code Online (Sandbox Code Playgroud)

profiling gperftools pprof

6
推荐指数
1
解决办法
2902
查看次数