GCC共享库问题

时间:2011-12-07 06:00:22

标签: c++ gcc ubuntu shared

我正在尝试使用gcc在ubuntu上创建一个共享库 我只有一个简单的类(shared.h和shared.cpp)和一个使用它的客户端(main.cpp)
这是我的makefile,我仍然无法让程序编译。

all:
    #compile object(fPIC: creates position independent code)
    gcc -fPIC -Wall -g -c shared.cpp

    #compile shared library
    gcc -shared -Wl,-soname,libshared.so.1 -o libshared.so.1.0.1 shared.o -lc

    #link shared library
    gcc -g -o main main.cpp -L. -lshared
  • 我确信第一行是正确的
  • 我不确定“-lc”是做什么的。我认为它传递给链接器?
  • 我不想安装库,我只是希望能够从当前目录链接它。我试过了:export LD_LIBRARY_PATH=.
    但它似乎没有什么区别。一切都在当前目录中。

      

    错误:/ usr / bin / ld:找不到-lshared

如何让编译器检查我的库的当前目录?

2 个答案:

答案 0 :(得分:4)

问题不在于它没有查看目录,问题是您已将库命名为“libshared.so.1.0.1”。当您使用-lshared时,它正在库搜索路径中查找名为“libshared.so”或“libshared.a”的文件。

大多数情况下,使用版本化系统库时,即使安装了“libshared.so.1”或“libshared.so.1.0”,也会提供最新版本的“libshared.so”链接。 2.1' 。

在您的情况下,如果您继续保留名为“libshared.so.1.0.1”的文件,则需要创建2个符号链接:

  1. libshared.so - 这样可以使用ld
  2. 找到库
  3. libshared.so.1 - 由于在构建时将SO名称声明为libshared.so.1,因此需要提供此链接,否则,可执行文件将无法在运行时找到正确的共享库。

答案 1 :(得分:0)

您不会编写任何依赖项,这是Makefile - s的目的。你可能需要强制run path或许类似

 .PHONY: all clean
 CXX=g++
 CXXFLAGS=-g -Wall
 all: main
 main: main.o libshared.so
        $(LINK.cpp) -o $@ $< -Wl,-rpath,. -L. -lshared
 libshared.so: shared.pic.o
        $(LINK.cpp) -shared -o $^ $< 
 main.o: main.cc shared.hh 
 %.pic.o: %.cc
        $(CXX) $(CXXFLAGS) -fPIC -c -o $@ $<
 #
 clean:
        rm -f *.o *.so main *~