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

kse8i1jr  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(138)

我试图让一个库在我的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文件,但想包括一个.so文件称为例如./directory/libtest.so

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

6kkfgxo0

6kkfgxo01#

现在从我可以看到的命令是-l + filename,例如我的文件名是directory/libtest.so它将是-ldirectory/libtest.so
不对,应该是-Ldirectory -ltest,也就是说,你用-L在搜索路径中添加一个目录,链接器将在该目录中查找库,你用-l说明要链接到哪些库,但是要链接到libtest.solibtest.a,你说-ltest而不带lib前缀或文件扩展名。
你可以通过显式命名文件来链接,没有-L-l选项,即只是directory/libtest.so,但对于动态库来说,这几乎总是错误的,因为它将确切的路径嵌入到可执行文件中,因此,当程序运行时,同一个库必须位于同一个位置。(而不是路径),以便可以在运行时从任何位置使用具有该名称的库。

jfewjypa

jfewjypa2#

这是一个如何创建和链接.so与.cpp文件的步骤
1.创建要转换为. so的.cpp文件。
举例来说─
第一个月
保存为名称add.cpp
1.使用以下命令创建.so
gcc -c -fPIC add.cpp -o add.o
这将创建libadd.so
1.创建一个将使用此.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
1.使用以下命令从此文件创建.o文件
g++ -c main_file.cpp
1.使用此命令将.so与.o链接
g++ -o prog main_file.o -L. -ladd
这里L指定了.so文件所在的文件夹
和-l指定.so库的名称
1.使用以下命令运行程序
./prog

t30tvxxf

t30tvxxf3#

pkg-config

我喜欢使用pkg-config --cflags --libs libtest来为我生成编译器标志和链接器标志。源代码安装只需要提供一个.pc文件,并将其放在PKG_CONFIG_PATH中列出的目录中,例如,/usr/local/lib/pkgconfig。您可以这样使用它:
g++ -o myprogram myprogam.c pkg-config --cflags --libs libtest`

重建链接缓存

即使LD_CONFIG_PATH包含/usr/local/lib,并且您的共享对象库(.so文件)也位于其中,您仍然可能会收到类似以下错误:
error while loading shared libraries: <INSERT LIBRARY NAME>.so.0: cannot open shared object file: No such file or directory
如果链接器缓存/etc/ld.so.cache在安装库后尚未重建。
您可以通过运行ldconfig(或sudo ldconfig,取决于/etc目录权限,这些权限可能只能由root用户写入)来修复此问题。
如果成功,ldconfig将不打印输出。要了解运行ldconfig时的详细输出,请使用-v(或--verbose)标志。
如果您曾经遇到过此错误,然后在您进行故障排除时它神奇地自行修复,那么可能是因为您遵循了某人的建议,并执行了以下操作
ldconfig -v | grep <INSERT LIBRARY NAME>
确保.so文件位于LD_LIBRARY_PATH中列出的目录中,如/usr/local/lib。如果您已经确认该目录包含在/etc/ld.so.conf/etc/ld.so.conf.d/*.conf中,但ldconfig -v仍然在详细模式下 * 运行 * ldconfig,这可能会重新构建/etc/ld.so.cache,并修复您的问题,则执行此故障排除步骤是合理的。
如果您的错误在一段时间后神秘地自行修复,而无需运行ldconfig,则系统上的其他东西必须从那时起运行它-例如启动脚本,计划任务或其他软件的安装脚本。

相关问题