【问题标题】:How to create a dynamic library for c++ on linux?如何在 linux 上为 c++ 创建动态库?
【发布时间】:2023-03-19 01:06:01
【问题描述】:

我想为 linux 上的 c++ 程序创建一个动态库。 在 c++ 程序/系统中,我使用 libconfig++ 库、libpqxx 库、一些 boost 和 c++11。

我的步骤: 1)

g++ -Wall -I/usr/local/include/ -std=c++0x -lconfig++ -Wall -lpqxx -lpq -fPIC -c ../SourceFiles/DBHandler.cpp ../SourceFiles/ParamServer.cpp ../SourceFiles/Functions.cpp

2)

g++ -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0   *.o

3)

ln -sf libctest.so.1.0 libctest.so.1

4)

ln -sf libctest.so.1.0 libctest.so

5) 编译

g++ -Wall -I/path/to/include-files -L/path/to/libraries program.cpp -I/usr/local/include/ -std=c++0x -lconfig++ -lpqxx -lpq -lctest -o prog

执行上述命令后:

/usr/bin/ld: cannot find -lctest
collect2: ld returned 1 exit status

我做错了什么?

这里是参考: enter link description here

【问题讨论】:

    标签: c++ boost c++11 dynamic-linking dynamic-library


    【解决方案1】:

    在第 5 步中,您忘记了 -L. 在当前目录中查找库。

    默认情况下,搜索库时仅使用 [long] 系统目录列表。

    您还需要在执行程序之前将. 添加到LD_LIBRARY_PATH 环境变量中,以便在运行时也搜索当前目录。运行ldconfig 可以避免这种情况,但如果您只是测试您的库并且不想持续影响您的系统,我会坚持使用LD_LIBRARY_PATH 方法。

    另一种方法是将您的库“安装”到其中一个目录中,例如/usr/local/lib(或您的等效目录)。完成此操作后,您应该使用ldconfig,以便为您设置动态库缓存和所有符号链接。这是规范的方法,但可能不适用于所述库的迭代开发。

    【讨论】:

    • 还需要运行ldconfig,所以仅靠这个答案是行不通的。
    • @DirkEddelbuettel:如果你想安装它,那就太好了。但情况并非总是如此。我如何开发和测试我的库肯定是“可选的”:这不取决于您或常见问题解答!
    • @DirkEddelbuettel:在我的整个职业生涯中,我一直很开心,我坚持我的答案中详述的建议,我也在我的答案中详述了用例。没必要。到。说话。像。这。只是。因为。你。不同意。
    • @andrew:这是一个全新的问题。 :) 答案几乎可以肯定取决于命令行上-l 标志的顺序...尝试将-lctest before 放在第三方库的标志之前。从左到右(或多或少)解决依赖关系
    • @andrew:那是因为你没有听从我的指示。你可以运行LD_LIBRARY_PATH=. ./prog。 Dirk 当然没有错,因为还有其他方法可以解决所有这些问题,ldconfigrpath 都是很好的例子:由您决定采用哪种方法。在我的回答中,我应用了自己的经验,并尝试猜测您的用例,这是一个位于开发目录中用于测试的临时库文件。
    【解决方案2】:

    你需要ldconfig更新动态库缓存——它也会为你创建符号链接。

    参见例如Section 3.5 of this Linux Documentation Project HOWTO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多