我试图让一个库在我的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
型
3条答案
按热度按时间6kkfgxo01#
现在从我可以看到的命令是
-l + filename
,例如我的文件名是directory/libtest.so
它将是-ldirectory/libtest.so
不对,应该是
-Ldirectory -ltest
,也就是说,你用-L
在搜索路径中添加一个目录,链接器将在该目录中查找库,你用-l
说明要链接到哪些库,但是要链接到libtest.so
或libtest.a
,你说-ltest
而不带lib
前缀或文件扩展名。你可以通过显式命名文件来链接,没有
-L
或-l
选项,即只是directory/libtest.so
,但对于动态库来说,这几乎总是错误的,因为它将确切的路径嵌入到可执行文件中,因此,当程序运行时,同一个库必须位于同一个位置。(而不是路径),以便可以在运行时从任何位置使用具有该名称的库。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
个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
,则系统上的其他东西必须从那时起运行它-例如启动脚本,计划任务或其他软件的安装脚本。