【问题标题】:Linking issues with wxWidget sample on Ubuntu 12.04 (amd64)Ubuntu 12.04 (amd64) 上 wxWidget 示例的链接问题
【发布时间】:2013-10-01 17:24:58
【问题描述】:

我在将 wxWidget 示例应用程序 (http://www.wxwidgets.org/docs/tutorials/hello.htm) 链接到 main.cpp 时遇到问题。我尝试使用以下方法编译和链接它:

g++ `wx-config --cxxflags --libs` main.cpp 

我得到的输出如下:

/tmp/ccFHWUaX.o: In function `wxCreateApp()':
main.cpp:(.text+0x31): undefined reference to `wxAppConsole::CheckBuildOptions(char const*, char const*)'
/tmp/ccFHWUaX.o: In function `main':
main.cpp:(.text+0x91): undefined reference to `wxEntry(int&, char**)'
/tmp/ccFHWUaX.o: In function `MyFrame::MyFrame(wxString const&, wxPoint const&, wxSize const&)':
main.cpp:(.text+0x1d2): undefined reference to `wxFrameNameStr'
main.cpp:(.text+0x267): undefined reference to `wxEmptyString'
main.cpp:(.text+0x2ea): undefined reference to `wxEmptyString'
main.cpp:(.text+0x366): undefined reference to `wxMenuBar::wxMenuBar()'
main.cpp:(.text+0x3d1): undefined reference to `wxFrameBase::SetMenuBar(wxMenuBar*)'
main.cpp:(.text+0x3da): undefined reference to `wxStatusLineNameStr'
main.cpp:(.text+0x407): undefined reference to `wxFrame::CreateStatusBar(int, long, int, wxString const&)'
main.cpp:(.text+0x44f): undefined reference to `wxFrameBase::SetStatusText(wxString const&, int)'
main.cpp:(.text+0x533): undefined reference to `wxFrame::~wxFrame()'
(and many lines more...)

WxWidgets-2.8 是使用 ubuntu 存储库安装的,它的库位于 /usr/lib/x86_64-linux-gnu。我还尝试构建指定库路径:

-L/usr/lib/x86_64-linux-gnu/

但是,这不会改变输出。我将我的问题归咎于 multiarch,但实际上只是因为我不知道它是如何工作的。

谁能告诉我如何正确构建示例?

谢谢 迈克尔

【问题讨论】:

  • 你试过把wx-config --libs after你的源文件放在命令行吗?
  • 我肯定会从命令提示符运行wx-config --cxxflags --libs 并验证它是否包含您期望的“-L”(库搜索路径)和“-l”(库文件)条目。可能 wx-config 配置不正确。恕我直言..
  • 这很奇怪...为什么我必须把它们放在源文件后面?我正在使用 eclipse 并且默认情况下链接器标志放置在输入之前。更改顺序解决了问题,太棒了,谢谢。顺便说一句:wx-config 的输出正确设置了 -L 和 -l 条目。

标签: c++ linux ubuntu wxwidgets


【解决方案1】:

使用静态链接时,库必须始终使用它们的符号在目标文件之后,否则它们会被链接器简单地忽略,因为此时不需要它们第一次见到他们。所以us2012是正确的,你需要把wx-config放在你的源文件后面。

您也可以使用共享的 wxWidgets 库,那么顺序就无关紧要了。但是使用正确的顺序仍然是一个好习惯,不管怎样,它适用于静态库和共享库。

【讨论】:

  • 如果是真的,那我在linux下没有得到静态链接的概念。在 Windows 中,您有一个 aLibrary.dll 和 aLibrary.lib 文件。当你链接到 aLibrary 时,你总是静态链接到 aLibrary.lib。 aLibrary.lib 的生成方式是在内部调用 LoadLibrary("aLibrary.dll") 和 GetProcAddress("someFunc") 来创建函数表。所以没有真正的动态链接。我说的对吗?
  • 不,这与 Windows 导入库(与静态库完全不同)无关。我真的只是在谈论用于确定要使用的库的链接器算法,它对生成的可执行文件绝对没有影响。
  • 我从来没有意识到链接中有一个顺序。以及我如何阅读手册页的参数完全由标志确定,并且在多次不使用相同标志时不会发生顺序。 g++ 手册页说:“您可以混合使用选项和其他参数。在大多数情况下,您使用的顺序并不重要。当您使用多个相同类型的选项时,顺序确实很重要;例如,如果您指定 -L 更多"你能详细说明一下吗?
  • 您可以通过简单的网络搜索找到更详细的解释,但它的长短已经在我的回答中:使用传统的 Unix 链接器,包括 GNU ld,当静态链接时,库必须紧随其后对象文件(和其他库)引用其中的符号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2013-10-24
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多