【问题标题】:Use the Library so in Linux with C++在带有 C++ 的 Linux 中使用库 so
【发布时间】:2013-06-04 17:50:52
【问题描述】:

我有一个包含函数列表的 so 文件,现在我想构建一个 C++ 程序来使用库中的这些函数

我已经尝试过:g++ -Llibname.so xxx.cpp 并设置了库 .so 的 LD_LIBRARY_PATH 环境变量,但是它仍然给我一个错误,比如找不到函数。

你能给我一些关于用库编译 C++ 程序的想法吗?

非常感谢!

#include <iostream>
#include <signal.hpp>
using namespace std;

int main() {
    cout << "!!!Hello World!!!" << endl;
    processData("/home/radwan/2011-07-22Field1/", 0,
                    4500, 1,
                    100, 70,
                    90, 8,
                    100,1.8);
    return 0;
}

头文件声明:

 int processData(char const * directory, int const minimumSignalLevel,
        int const maximumSignalLevel, int const samplingFactor,
        int const minimumTrackDimension, int const minimumMissingVineStocksDimension,
        int const maximumMissingVineStocksDimension, int const maximumFoliageHoleDimension,
        int const cellSide4Average,float const & FRF_R_threshold_Value);

【问题讨论】:

  • g++选项-L指定搜索库的目录;使用-l 指定库本身。另外,这个库也是由 g++ 生成的吗?
  • g++ -LLIBRARY_PATH -lLIBRARY_NAME ...。如果你想用 '/usr/local/lib/libsome_lib.so' 链接可执行文件,那么你使用 args -L/usr/local/lib -lsome_lib 执行 g++。
  • g++ xxx.cpp /usr/local/lib/libsome_lib.so 也可以,但我更喜欢使用 -L 和 -l 参数。

标签: c++ centos shared-libraries


【解决方案1】:

我觉得你应该把header给调用者,让调用者通过#include找到它。 每个cpp文件都是先通过自身查找符号,如果你不告诉它其他头信息,它就不会搜索。 但是如果你cc一些*.c文件,编译器会帮助找到对方,即使你不给头文件。

【讨论】:

  • 所以我应该包含我在库中拥有或可能拥有的所有标题?
【解决方案2】:

LD_LIBRARY_PATH 用于帮助在运行时查找.so 文件。您还可以对可执行文件中的一些路径进行硬编码。反正编译行的一般格式是:

g++ -L可以找到库的目录-l名称不带lib前缀或.so扩展名` xxx.cpp -o xxx

【讨论】:

  • 当我像你上面提到的那样指定所有路径和参数时,我仍然有一个找不到函数的错误,在我的情况下是 processData() :(
  • 您遇到编译时错误或链接时错误?前者可能是因为库的头文件没有与您的调用匹配的声明。后者可能是因为头文件声明了 .so 不包含的内容....并打电话)。
  • 我有一个编译时错误,是的,我认为这可能是因为头文件,我有一个测试文件 (c++),它是由一家生产 lib 的公司创建的(请看一下在我刚刚在上面添加的新代码中)作为 linux 新手,感谢您帮助我!错误是找不到processData
  • 嗯...有趣。能否请您也发布signal.hpp 头文件中的processData 函数声明?
  • @user2076858:当我使用该函数声明和您的函数调用时,它会正确编译,并且由于我没有要链接的库而出现“对processData(... 的未定义引用”错误。如果我将函数声明更改为定义(将结尾的; 替换为{ }),它可以干净地编译和链接。能否请您发布错误消息的完整、准确的文本?
【解决方案3】:

请注意,库和目标文件的顺序可能很重要。我最近遇到了类似的问题,解决方案是在链接器命令行中重新排序库开关。

你可以看看这里,看看这是否是你的问题:Linking a DLL using xerces gives undefined symbols

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多