【问题标题】:wxWidgets and fetch_content in cmakecmake 中的 wxWidgets 和 fetch_content
【发布时间】:2021-06-18 13:15:34
【问题描述】:

我想将 fetch_content 与 wxWidgets 一起使用。到目前为止,我有这个并且它“有效”。但我不确定我应该在 target_link_libraries 中链接什么。 main.cpp 是一个 hello world 示例,它无法编译,因为它找不到 #include

编辑1 我设法通过手动添加库来运行 cmake 脚本。问题仍然是它到目前为止没有在 Windows 上链接,并且只在 arch linux 上工作过一次。 编辑2 这个 cmake 在 windows 和 linux 上工作和构建。

    include(FetchContent)
    
    
    if (MSVC)
        add_executable(_TARGET_
            WIN32
            src/main.cpp
        )
    else()
        add_executable(_TARGET_
            src/main.cpp
        )
    endif()
    
    # ------------------ wxWidgets ------------------
    set(wxBUILD_SHARED OFF CACHE BOOL "Build wx libraries as shared libs")
    set(wxBUILD_PRECOMP OFF CACHE BOOL "Use precompiled headers")
    set(wxBUILD_MONOLITHIC OFF CACHE BOOL "Build a single library")
    
    FetchContent_Declare(
        wxWidgets 
        GIT_REPOSITORY https://github.com/wxWidgets/wxWidgets.git
        GIT_TAG        v3.1.4
        GIT_SHALLOW     TRUE
    )
    
    FetchContent_GetProperties(wxWidgets)
    FetchContent_MakeAvailable(wxWidgets)
    
    target_link_libraries(foo
        wxbase
        wxcore
        wxnet
    )

【问题讨论】:

  • 您收到的具体错误信息是什么?你能编译 wxWidgets 提供的minimal 示例吗?您尝试在哪个操作系统/编译器上运行它?
  • 你能找到 wx/wx.h 或 wx/wxprec.h 吗?我在 Windows 上遇到了编译问题。

标签: cmake wxwidgets


【解决方案1】:

我遇到了同样的问题,并提供了完整的答案(即使迟到了),但可能对那些在谷歌上搜索这个问题的人有用......

要删除 #include 周围的包含错误,您还需要指定这些文件所在的包含目录,在我的情况下,我有类似的内容:

add_executable(foo WIN32 "")
target_include_directories(stlGUI PRIVATE ${wxWidgets_SOURCE_DIR}/include/msvc)
target_include_directories(stlGUI PRIVATE ${wxWidgets_SOURCE_DIR}/include)

这消除了包含错误。在您的情况下,您似乎正在将 wxWidgets 编译为静态库。我发现为了使这些静态库可见,您还应该包含链接器的目录,即

target_link_directories(foo PRIVATE ${CMAKE_BINARY_DIR}/lib/vc_x64_lib/)

如果您想将其编译为共享库(或其他人),我发现库包含路径可能构造错误。 CMake 需要 FetchContent_MakeAvailable 函数未处理的附加信息。我遇到了一条错误消息,上面写着类似

fatal error C1083: Cannot open include file: '../../../lib/vc_x64_lib/mswd/wx/setup.h': No such file or directory.

在我的例子中,setup.h 文件实际上位于../../../lib/vc_x64_dll/mswud/wx/setup.h,即注意它是 dll,而不是 lib 和 mswud,而不是 mswd。第一个问题可以通过告诉 wxWidgets 我们使用的是 DLL,而不是 LIB 来解决(即使我们将其配置为共享库,在配置期间可能有一个选项我们可以设置,但该步骤已通过 FetchContent_Declare 为我们抽象出来) ...无论如何,我们需要定义一些预处理器宏,对于 DLL 部分,我们必须包含

target_compile_definitions(foo PRIVATE WXUSINGDLL=1)

类似地,要在 mswud 中获取 u(代表 unicode 支持),我们需要告诉 CMake 使用 unicode with

target_compile_definitions(foo PRIVATE _UNICODE=1)

现在应该编译库。一旦您开始将它与您的示例中的可执行文件链接起来,您可能会遇到找不到库的运行时错误。将无法从${CMAKE_BINARY_DIR}/lib/vc_x64_dll 文件夹中找到的库复制到保存可执行文件的文件夹中(通常为${CMAKE_BINARY_DIR}/Debug/,即让您的*.dll 文件与您的*.exe 文件并排放置,或者指定环境变量PATH (windows) 或 LD_LIBRARY_PATH (UNIX) 指向保存库的文件夹。您也可以在 CMake 中执行此操作

# set RPATH to find dynamic libraries at runtime (windows only)
if (WIN32)
  set(ENV{PATH} "${CMAKE_BINARY_DIR}/lib/vc_x64_dll;$ENV{PATH}")
endif()

希望这会有用,关于这个问题的文档似乎很少,我花了太多时间来解决这个问题。以上内容并不完美(并且仅针对 Windows 进行了真正的测试,尽管我希望该方法也适用于 UNIX 以及修改变量名),但希望是其他有相同问题的人的起点。

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 2011-08-17
    • 2021-07-07
    • 2021-09-30
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多