【问题标题】:Link .so file to .cpp file via g++ compiling通过 g++ 编译将 .so 文件链接到 .cpp 文件
【发布时间】:2014-11-30 01:02:16
【问题描述】:

我正在尝试让一个库在我的 c++ 项目中工作,但对于不习惯 c++ 的人如何做到这一点没有明确的说明

以下link是我来的最近的

它说明了以下内容

-L/path/to/my/library/folder -ldllname

以下thread 声明如下

gcc yourfile.cpp -lblah

现在我可以看到命令是-l + filename,例如我的文件名是directory/libtest.so 它会是-ldirectory/libtest.so,这是正确的,有人可以澄清一下

我目前正在使用以下命令来编译我的 maincpp.cpp 文件,但希望包含一个名为例如 ./directory/libtest.so 的 .so 文件

g++ -fPIC -o libgetmacip.so -shared -I $JAVA_HOME/include -I $JAVA_HOME/include/linux maincpp.cpp cpptoinclude.cpp

【问题讨论】:

  • 您必须记住,将动态库提供给二进制文件意味着仅声明此二进制文件应在执行时链接到 该名称的库(不是那个库)。在执行时,system 中必须存在这样的库(例如,在 LD_LIBRARY_PATH 中),因此为其指定特定目录没有多大意义。

标签: c++ linux


【解决方案1】:

现在我可以看到命令是-l + filename,例如我的文件名是directory/libtest.so,它将是-ldirectory/libtest.so

不,这是不正确的。它应该是-Ldirectory -ltest,即您使用-L 将目录添加到链接器将在其中查找库的搜索路径,并且您说要使用-l 链接到哪些库,但要链接到libtest.so 或@ 987654330@ 你说-ltest 没有lib 前缀或文件扩展名。

可以通过显式命名文件进行链接,无需-L-l 选项,即仅directory/libtest.so,但对于动态库,这几乎总是错误的做法,如它将确切的路径嵌入到可执行文件中,因此当程序运行时,同一个库必须位于同一个位置。您通常希望通过名称(而不是路径)链接到它,以便可以在运行时从任何位置使用具有该名称的库。

【讨论】:

【解决方案2】:

这是如何创建和链接 .so 与 .cpp 文件的分步过程

  1. 创建要转换为 .so 的 .cpp 文件。
    示例 -
    #include<stdio.h> int add(int a , int b) { return a+b;}

    按名称add.cpp保存

  2. 使用以下命令创建 .so
    gcc -c -fPIC add.cpp -o add.o

    这会创建 libadd.so

  3. 创建一个将使用此 .so 文件的 .cpp 文件
    示例-
    #include<stdio.h> extern int add(int a, int b); int main(int argc, char** argv) { printf("Hello the output is %d \n",add(10,15)); return 0; }

    另存为main_file.cpp

  4. 使用此命令从该文件创建一个 .o 文件
    g++ -c main_file.cpp

  5. 使用此命令将 .so 与 .o 链接
    g++ -o prog main_file.o -L. -ladd

    这里 L 指定带有 .so 文件的文件夹
    而-l 指定.so 库的名称

  6. 使用命令运行程序
    ./prog

【讨论】:

  • 感谢这个例子对我非常有用。我认为它缺少一步:2.a gcc -shared -o libadd.soo add.o
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2018-03-10
  • 2021-12-28
相关资源
最近更新 更多