通过g ++编译将.so文件链接到.cpp文件

时间:2014-11-30 01:02:17

标签: c++ linux

我正在尝试让一个库在我的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

2 个答案:

答案 0 :(得分:18)

  

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

不,那不正确。它应该是-Ldirectory -ltest,即您使用-L将目录添加到链接器将查找库的搜索路径,并说明要链接到-l的库,但要链接在没有libtest.so前缀或文件扩展名的情况下,您libtest.a-ltest lib

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

答案 1 :(得分:0)

这是有关如何创建.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