Plugins app和lib中同名的类在*从Makefile转换为cmake后*会导致问题

Plugins app和lib中同名的类在*从Makefile转换为cmake后*会导致问题,plugins,gcc,makefile,cmake,name-conflict,Plugins,Gcc,Makefile,Cmake,Name Conflict,我正在尝试将一个程序及其插件从自定义Makefiles转换为CMake,只需对代码进行最小的更改 插件和应用程序都共享一些代码;如果定义。。。其他的endif块用于存在差异的地方,我确信代码是用正确的定义编译的。共享代码包括一个名为ToolImage的类。为应用程序编译代码时,ToolImage构造函数使用的资源路径与为插件编译代码时不同 #ifdef THE_APP ToolImage::ToolImage(const wxString& name, bool full_path_g

我正在尝试将一个程序及其插件从自定义Makefiles转换为CMake,只需对代码进行最小的更改

插件和应用程序都共享一些代码;如果定义。。。其他的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
{
 ...
}
当程序及其插件使用自定义Makefiles进行编译时,一切都按预期进行。使用我创建的一系列CMakeLists.txt文件,使用CMake编译这两个文件后,出现了一个问题:插件无法加载其工具栏的位图

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

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


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

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


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

我通过在CMakeLists.txt中添加链接器标志-Wl,-b符号函数修复了这一问题:

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