在cygwin下增强c ++静态链接路径

时间:2011-05-08 02:32:38

标签: c++ boost static g++ ld

我用c ++编写了一个利用boost头文件的程序。当我编译它时,我注意到我有一些未定义的符号用于boost系统和boost文件系统(我预期)。我终于得到了我的程序编译和链接,但我可以理解为什么。如果有人能够对以下内容提供一些见解,我会很感激。

最终的编译语句是:g ++ dcc_to_png.c -lboost_system-mt -lboost_filesystem-mt 但是看一下boost / state / lib,/ cygdrive / c / Users / Joe / My \ Documents / My \ Dropbox / Code / boost_1_46_1 / stage / lib下列出的库名是libboost_system.a和libboost_filesystem.a。

我不明白的是

a)我正在使用boost_system-mt等这些字符串是什么?他们在哪里定义了他们所指的内容?他们如何解决实际的库?

b)出于某种原因,如果我自己尝试这样做,ld抱怨它找不到lib。例如:

  

g ++ dcc_to_png.c -L“/ cygdrive / c / Users / Joe / My Documents / My Dropbox / Code / boost_1_46_1 / stage / lib”-llibboost_system.a -llibboost_filesystem.a

的产率:

  

/usr/lib/gcc/i686-pc-cygwin/4.3.4 /../../../../ i686-pc-cygwin / bin / ld:找不到-llibboost_system.a   /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld:找不到-llibboost_filesystem.a   collect2:ld返回1退出状态

c)在编译+链接的语句中,为什么我必须在boost_system结束时使用-mt?我理解-mt表示什么,但是如何解析我文件系统上的lib?

2 个答案:

答案 0 :(得分:2)

好的 - 所以发现了一些东西。首先就搜索路径而言,请参阅:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html。这有助于在链接时澄清搜索路径。

其次 - 请注意,在名称末尾使用-mt的想法来自于不再需要的旧的提升约定。

请参阅:http://groups.google.com/group/linux.debian.bugs.dist/browse_thread/thread/5177d8bf13791038?pli=1

最后但并非最不重要 - 如果你是像我这样的cygwin用户,你应该注意一些问题。安装devel工具时,您可能已经安装了46_1之前的boost标头版本(我正在使用)。这些将在/ usr / include / boost /中,并且如果在系统上构建boost后使用这些头文件,则libs将与您找到的头文件不匹配,并且您将始终获得对boost::system::get_system_category() because these headers may expect you to reference the的未定义引用 - mt libs. If you didn't build boost on your box this will work fine if you just include a - mt`在有问题的lib的末尾(它在另一个盒子上为我做了,这让我很难以理解,直到我发现它。)

我的答案就是备份(以防万一),然后在/usr/include/boost/中删除标题,然后强制包含我的源代码的提升标题ala -I并强制链接完整我的libs的路径。这迫使g ++使用libs +匹配的标题。

$ g++ dcc_to_png.c dccinfo.c -I"$CODEDIR/boost_1_46_1/" -include dccinfo.h /usr/lib/filesystem/build/gcc-4.3.4/release/link-static/threading-multi/libboost_filesystem.a /usr/lib/system/build/gcc-4.3.4/release/link-static/threading-multi/libboost_system.a -o dcc_to_png.exe

这有效 - 但只有在g ++找不到那些旧标题时它才会起作用。如果你还没有建立提升并且你想让它发挥作用 - 我相信你可以省略-I而只是使用-lboost_filesystem-mt -lboost_system-mt,但这绝对取决于提升的版本。 (见上面的帖子)。

答案 1 :(得分:0)

-llibboost_system.a -llibboost_filesystem.a

但是

-lboost_system -lboost_filesystem

或提供完整路径

g++ dcc_to_png.c /cygdrive/c/Users/Joe/My Documents/My Dropbox/Code/boost_1_46_1/stage/lib/libboost_filesyste.a /cygdrive/c/Users/Joe/My Documents/My Dropbox/Code/boost_1_46_1/stage/lib/libboost_system.a