*在 *转换为从makefile转换为cmake之后,应用程序和lib中的同名类别引起了问题 *

StackOverflow https://stackoverflow.com/questions/4675481

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

插件和应用程序都共享一些代码; #ifdef ... #else ... #endif块在存在差异的地方使用,我敢肯定,该代码已编译为正确的定义。共享代码包括一个名为“ 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
{
 ...
}

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

我将问题跟踪到工具类别。 GDB给出的行号告诉我,插件使用了错误的构造函数。 Strace告诉我同样的事情(该插件正在在应用程序的资源DIR中寻找其位图,而不是在插件的资源DIR中寻找其位图)。为了确保我没有定义搞砸了,我将#Error在toolimage.cpp中放置在#IFDEF的一部分内,该应用程序仅应为应用程序编译,并且该插件仍然没有错误地编译。这告诉我插件正在使用正确的代码编译。由于它使用了错误的路径,因此我认为它使用的是将类和构造函数编译到程序中而不是自己的类别。

如何确保插件使用其自己的工具标准类而不是应用程序中的工具类别?我不拥有该项目,也不想仅仅为通过不同的构建系统提供支持建设而进行大规模更改。

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

有帮助吗?

解决方案 2

我通过添加链接标志来解决此问题 -wl, - bloctymbolic函数 在cmakelists.txt中:

set_target_properties( heekscnc PROPERTIES LINK_FLAGS -Wl,-Bsymbolic-functions )

其他提示

为了实验,我会添加-Fvisibility = hidden thed theeps时,将其添加到全部或可能的特定来源中。这应该从插件隐藏应用程序的工具。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top