1

我正在尝试将程序及其插件从自定义 Makefile 转换为 CMake,而对代码的更改最少。

插件和应用程序都共享一些代码;#ifdef ... #else ... #endif 块用于存在差异的地方,我确信代码是使用正确的定义编译的。共享代码包括一个名为 ToolImage 的类。为应用程序编译代码时,ToolImage 构造函数使用与为插件编译时不同的资源路径。

#ifdef THE_APP
 ToolImage::ToolImage(const wxString& name, bool full_path_given):wxImage(full_path_given?name:
 (wxGetApp().GetResFolder() + _T("/bitmaps/") + name + _T(".png")), wxBITMAP_TYPE_PNG)
#else
 ToolImage::ToolImage(const wxString& name, bool full_path_given):wxImage(full_path_given?name:
 (theApp.GetResFolder() + _T("/bitmaps/") + name + _T(".png")), wxBITMAP_TYPE_PNG)
#endif
{
 ...
}

使用自定义 Makefile 编译程序及其插件后,一切都按预期工作。当两者都使用 CMake 编译时,使用我创建的一系列 CMakeLists.txt 文件,存在一个问题:插件无法为其工具栏加载位图。

我将问题跟踪到 ToolImage 类。gdb 给出的行号告诉我插件使用了错误的构造函数。strace 告诉我同样的事情(插件在应用程序的资源目录中而不是在插件的资源目录中寻找它的位图)。为了确保我没有搞砸定义,我在 ToolImage.cpp 中放了一个#error,在应该只为应用程序编译的#ifdef 部分内 - 并且插件仍然编译没有错误。这告诉我插件正在使用正确的代码进行编译。由于它使用了错误的路径,我认为它使用的是编译到程序中的类和构造函数,而不是它自己的。

如何确保插件使用自己的 ToolImage 类而不是应用程序中的类?!我不拥有该项目,也不想仅仅为了支持使用不同的构建系统进行构建而进行大规模更改。

使用预编译器创建一个类的两个版本对我来说似乎是一个糟糕的选择。如果我必须对代码进行更改,您是否有解决方法的建议?

4

2 回答 2

0

为了实验,我会在构建应用程序时将 -fvisibility=hidden 添加到所有或某些特定来源。这应该从插件中隐藏应用程序的 ToolImage。

这不是一种通用方法,因为在许多情况下,插件确实使用与主可执行文件不同的符号。

于 2011-02-06T01:57:28.477 回答
0

我通过在 CMakeLists.txt 中添加链接器标志-Wl,-Bsymbolic-functions来解决此问题:

set_target_properties( heekscnc PROPERTIES LINK_FLAGS -Wl,-Bsymbolic-functions )
于 2011-08-05T13:24:07.077 回答