2

我有一个问题,我想用 mysql 连接器的静态链接来编译我的应用程序。

我的命令行:

g++ -o newserver stdafx.cpp ... -lboost_system -lboost_thread -lpthread -lmysqlcppconn -static /usr/lib/libmysqlcppconn-static.a -std=c++0x

但我有错误:

/usr/bin/ld: cannot find -lmysqlcppconn
/tmp/ccxpOfdZ.o: In function `IsEqualsDns(unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
Server.cpp:(.text+0x356e): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
collect2: ld returned 1 exit status

我怎样才能解决这个问题?谢谢!

4

2 回答 2

3

图书馆libsqlcppconn.alibsqucppconn.so (静态或动态)在哪里?编译器正在寻找它,但没有找到。

据推测,这是与 /usr/lib/mysqlcppconn-static.a. 如果是这样,只需删除 -lmysqlcppconn. 或者只是使用-lmysqlcppconn-static(没有空格),然后忘记/usr/lib/libmysqlconn-static.a. 使用这样的名称,不应该有对应的.so.,这意味着 g++ 将静态链接它,即使没有 -static. 您只需要-static如果在同一目录中同时存在 alibmysqlconn-static.so和 a 。libmysqlconn-static.a

关于第二个错误(这只是一个警告,但如果您尝试在其他机器上运行链接的程序,甚至在您的机器升级之后会导致问题):如果您-static在命令行中的任何位置使用(如您目前可以),然后它适用于之后链接的所有文件。包括您不想静态链接的系统。我的猜测是-static没有必要(见上文);如果是,请将其放在要静态链接的库之前,并在-dynamic之后立即放置(以便任何后续库,包括系统库,都将被动态链接)。

于 2013-01-15T15:49:12.320 回答
1

你可以试试g++ -static YOUR ARGUMENTS

如果您来自 Windows 平台,链接到 Boost 可能会带来一些惊喜。典型的 Boost 安装(例如 after ./b2 install)将创建动态库和静态库并将它们放在同一目录中。通常,这两种库形式仅在扩展名(.so 或 .a)上有所不同。

Windows 支持自动链接,这基本上意味着库文件在其前几个字节中包含一些标志,指示它们是用于动态链接还是用于静态链接。在 Linux 平台上,情况并非如此,并且链接器会混淆要加载哪个文件(因为您没有提供库名称的扩展名)。因此,您需要告诉链接器您想要哪种形式的链接。

于 2013-01-15T15:09:34.807 回答