【问题标题】:GCC Shared Library ProblemsGCC 共享库问题
【发布时间】:2012-01-14 17:05:58
【问题描述】:

我正在尝试使用 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

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

【问题讨论】:

    标签: c++ gcc ubuntu shared


    【解决方案1】:

    你不写任何依赖,这是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 *~
    

    【讨论】:

    • 哈哈,我知道我违反了制作礼仪,但我只想让它先发挥作用。 “-rpath”没有这样做,但这绝对是我需要添加的。它仍然得到一个错误,说它无法在这里找到它:/usr/bin/ld
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢。它找到了它,我得到了一堆未定义的引用。所以我认为这是因为我只有 libshared.so 而不是 libshared.so.1 错误:/tmp/ccZrfhqj.o: In function `__static_initialization_and_destruction_0(int, int)':
    • @Xploit:既然你有正确的答案,为什么不接受呢?您有 0 个接受的答案(这不是因为您的问题没有正确回答)。
    • @Serge Dundich,该网站的新手- 谢谢。遇到此问题的任何人请注意:确保您使用的是 g++ 而不是 gcc
    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2016-02-17
    相关资源
    最近更新 更多