GCC共享库问题

GCC Shared Library Problems

本文关键字:问题 共享 GCC      更新时间:2023-10-16

我正在尝试在ubuntu上使用gcc创建一个共享库
我只有一个简单的类(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: cannot find -lshared

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

问题不在于它没有在目录中查找,问题是您将库命名为"libshare .so.1.0.1"。当您使用-lshared时,它会查找名为"libshared"的文件。所以' or 'libshared。

大多数时候,当使用版本化的系统库时,你会提供一个链接到最新的libshared。所以,即使你已经安装了libshared.so。1'或'libshare .so.1.0.1'。

在您的示例中,如果您继续保留名为'libshare .so.1.0.1'的文件,则需要创建2个符号链接:

  1. libshared。so -这样可以使用ld
  2. 找到库
  3. libshared.so。1 -既然你声明了SO名称为libshared.so。1 .在构建时,需要提供这个链接,否则,可执行文件将无法在运行时找到合适的共享库。

您不编写任何依赖项,这是Makefile -s的目的。你可能需要强制运行路径比如

 .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 *~