编写简单的连接MongoDB数据库C++程序 && 解决编译C++程序时链接MongoDB动态库失败的问题
2013-07-15 11:31
519 查看
不过重点在于如何让这个程序真正可以跑起来显示出来结果,着实费了一番功夫。
在终端输入“g++ mon2.cpp -I /usr/include/mongo/ /usr/lib/libmongoclient.a -lboost_thread -lboost_filesystem -lboost_program_options”进行编译C++程序。
”-lboost_thread -lboost_filesystem -lboost_program_options“这三个是编译关于mongo的C++程序需要用到的动态库,问题往往出现在这里,涉及到数据库的程序编译不通过,八成是找不到对应的动态库文件。
常见的错误如下图所示:
二. 解决编译C++程序时链接mongo的动态库失败的问题
最简单的解决办法:
在root用户下,首先进入mongo的库目录(我的路径是"/usr/lib"),然后在终端输入"ls
-al | grep libboost"查找相应的动态链接库文件,如果找不到以".so"结尾文件,则拷贝("cp
源文件 目标文件")下面显示的七个动态库到当前目录,并且命名为"xxx.so"
,或者创建这七个动态库的软链接到当然目录(会在下面提到)。
然后修改"/etc/ld.so.conf"文件,增加一行刚才存放.so文件的目录的地址,如下图则增加一行"/usr/lib"
保存完以后,运行"ldconfig"命令使配置生效。
(OVER)
以上已经达到了可以运行编译的条件。下面再说下我在解决问题遇到的几种特殊的情况。
------------------------------------------------------------------------------------------------------------
第一种情况:只要生成xxx.so文件与原来自带的动态库文件在同一个目录下面(不在同一个目录下面的软链接不起作用,具体见第三种情况),那么除了上面说到的拷贝方法生成.so文件,也可以通过创建软链接(ln -s 源文件 目标文件), 也可以达到目标,生成完以后通过"ls
-al | grep libboost"查看生成软链接。
第二种情况:如果仅仅是进行了复制或者创建软链接到当前目录,而没有修改"/etc/ld.so.conf"文件,则可能会碰到下面的错误。
第三种情况:如果不在同一个目录的话,比如动态库文件在"/usr/lib"下面,想要生成的"xxx.so"文件存放在"/usr/local/lib"下面的情况。
(1)注意一:不能用软链接的方法,只能通过拷贝的办法来实现。创建的软链接与本来的动态库文件要是不在一个目录,编译依然会报错,即使编译的时候通过“-L”指定动态库所在的文件夹也不会起作用,如下图。
注意:这里软链接虽然没用,但是当要创建的软链接与源文件不在同一目录时,创建软链接一定要用绝对路径,使用相对路径名会造成不必要的错误。
(2)注意二:通过拷贝的办法来实现第三种情况,用拷贝“cp"命令将动态库文件以".so"结尾拷贝到"/usr/local/lib"下面.
查看拷贝到"/usr/local/lib"中的”.so"文件
然后修改相应的"/etc/ld.so.conf"文件,在终端输入"ldconfig"使配置生效。
然后编译,编译通过以后,会发现系统会自动在“/usr/local/lib"下面创建关于".so"文件的软链接(原因不详)。
编译通过,会在”/usr/local/lib“文件夹中自动生成了软链接,链接到".so"文件。
下面就来运行下生成的a.out吧。
1 #include <iostream> 2 #include "client/dbclient.h" 3 4 using namespace mongo; 5 using namespace std; 6 void run() { 7 DBClientConnection c; 8 c.connect("localhost"); 9 } 10 11 int main() { 12 try { 13 run(); 14 cout << "connected ok" << endl; 15 } catch( DBException &e ) { 16 cout << "caught " << e.what() << endl; 17 } 18 return 0; 19 }
在终端输入“g++ mon2.cpp -I /usr/include/mongo/ /usr/lib/libmongoclient.a -lboost_thread -lboost_filesystem -lboost_program_options”进行编译C++程序。
”-lboost_thread -lboost_filesystem -lboost_program_options“这三个是编译关于mongo的C++程序需要用到的动态库,问题往往出现在这里,涉及到数据库的程序编译不通过,八成是找不到对应的动态库文件。
常见的错误如下图所示:
二. 解决编译C++程序时链接mongo的动态库失败的问题
最简单的解决办法:
在root用户下,首先进入mongo的库目录(我的路径是"/usr/lib"),然后在终端输入"ls
-al | grep libboost"查找相应的动态链接库文件,如果找不到以".so"结尾文件,则拷贝("cp
源文件 目标文件")下面显示的七个动态库到当前目录,并且命名为"xxx.so"
,或者创建这七个动态库的软链接到当然目录(会在下面提到)。
然后修改"/etc/ld.so.conf"文件,增加一行刚才存放.so文件的目录的地址,如下图则增加一行"/usr/lib"
保存完以后,运行"ldconfig"命令使配置生效。
(OVER)
以上已经达到了可以运行编译的条件。下面再说下我在解决问题遇到的几种特殊的情况。
------------------------------------------------------------------------------------------------------------
第一种情况:只要生成xxx.so文件与原来自带的动态库文件在同一个目录下面(不在同一个目录下面的软链接不起作用,具体见第三种情况),那么除了上面说到的拷贝方法生成.so文件,也可以通过创建软链接(ln -s 源文件 目标文件), 也可以达到目标,生成完以后通过"ls
-al | grep libboost"查看生成软链接。
第二种情况:如果仅仅是进行了复制或者创建软链接到当前目录,而没有修改"/etc/ld.so.conf"文件,则可能会碰到下面的错误。
第三种情况:如果不在同一个目录的话,比如动态库文件在"/usr/lib"下面,想要生成的"xxx.so"文件存放在"/usr/local/lib"下面的情况。
(1)注意一:不能用软链接的方法,只能通过拷贝的办法来实现。创建的软链接与本来的动态库文件要是不在一个目录,编译依然会报错,即使编译的时候通过“-L”指定动态库所在的文件夹也不会起作用,如下图。
注意:这里软链接虽然没用,但是当要创建的软链接与源文件不在同一目录时,创建软链接一定要用绝对路径,使用相对路径名会造成不必要的错误。
(2)注意二:通过拷贝的办法来实现第三种情况,用拷贝“cp"命令将动态库文件以".so"结尾拷贝到"/usr/local/lib"下面.
查看拷贝到"/usr/local/lib"中的”.so"文件
然后修改相应的"/etc/ld.so.conf"文件,在终端输入"ldconfig"使配置生效。
然后编译,编译通过以后,会发现系统会自动在“/usr/local/lib"下面创建关于".so"文件的软链接(原因不详)。
编译通过,会在”/usr/local/lib“文件夹中自动生成了软链接,链接到".so"文件。
下面就来运行下生成的a.out吧。
相关文章推荐
- 编写简单的连接MongoDB数据库C++程序 && 解决编译C++程序时链接MongoDB动态库失败的问题
- 编写简单的连接MongoDB数据库C++程序 && 解决编译C++程序时链接MongoDB动态库失败的问题
- 【转】C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- java使用“用户名+密码”连接mongodb,认证失败的问题解决
- Mongodb连接失败问题的几种情况和解决方式
- Dev_c++下解决编译winsock和pthread 的链接问题C++&STL
- 解决mongodb连接失败问题
- 从零开始C++ 第二课 CC++初体验,编写一个简单的程序·hello C++ 课程一天第二课
- 解决mongodb连接失败问题
- 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法 vc链接静态库的时候要注意的问题
- MPI编译C++程序出现#error "SEEK_SET is #defined but must not be for the C++ binding of MPI" 的解决方法
- "无法连接到服务器,用户xxx登陆失败" 解决问题
- 解决Linux程序编译链接动态库版本的相关问题
- Mongodb连接失败问题的几种情况和解决方式
- vs2013—未解决问题—编写简单的图片下载程序
- 编写C++风格的程序,解决百钱问题,将1元人民币兑换成1,2,5分的硬币,有多少种换法
- C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- mongodb3.03以上开启认证,解决程序认证连接报错以及第三方客户端无法认证问题
- SQL2008无法连接到.\SQLEXPRESS,用户'sa'登录失败(错误18456)图文解决方法 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: 共享内存提供程序, er