gpt4 book ai didi

c++ - 在cygwin下 boost c++静态链接路径

转载 作者:行者123 更新时间:2023-11-30 04:34:32 25 4
gpt4 key购买 nike

我利用 boost.h 中的头文件用 C++ 编写了一个程序。当我编译它时,我注意到我有一些 undefined symbol 用于 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 会提示找不到库。例如:

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: cannot find -llibboost_system.a /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: cannot find -llibboost_filesystem.a collect2: ld returned 1 exit status

c) compiles + links 的语句中,为什么一定要在boost_system 的末尾加上-mt?我明白 -mt 表示什么,但它如何解析为我的文件系统上的库?

最佳答案

好的 - 所以找到了一些东西。首先在搜索路径方面参见:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html .这有助于在您链接时明确搜索路径。

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

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

最后但并非最不重要的一点 - 如果您是像我这样的 cygwin 用户,您应该注意一些问题。当您安装开发工具时,您可能已经安装了 46_1(我正在使用)之前的 boost 头文件版本。这些将在/usr/include/boost/中,如果您在系统上构建 boost 后使用这些 header ,您的库将与您找到的 header 不匹配,并且您将始终获得对 boost::system 的 undefined reference ::get_system_category() 因为这些 header 可能希望您引用 -mtlibs。如果你没有在你的盒子上构建 boost ,如果你只是在有问题的库的末尾包含一个 -mt` 就可以正常工作(它在另一个盒子上为我做了,这令人难以置信,直到我想通了出来)。

我的答案是备份(以防万一),然后清除 /usr/include/boost/ 中的 header ,然后强制包含我的源代码的 boost header ala -I 并强制将完整路径链接到我的库。这会强制 g++ 使用匹配的库和 header 。

$ 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++ 找不到那些旧 header 时才会行得通。如果您还没有构建 boost 并且希望它起作用 - 我相信您可以省略 -I 并只使用 -lboost_filesystem-mt -lboost_system-mt 但这个绝对取决于 boost 的版本。 (参见上面的线程)。

关于c++ - 在cygwin下 boost c++静态链接路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5925254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com