【问题标题】:Static Compilation for wxWidgets C++wxWidgets C++ 的静态编译
【发布时间】:2018-11-08 14:18:18
【问题描述】:

首先,我想指出,我花了几个小时试图解决问题,但没有成功。我在 Mac 上的 Clion 中使用 C++ 的 wxWidgets 库编写了一个小项目。由于我的大多数同学都在 Windows 上的 VisualStudio 中完成了他们的项目,所以没有人可以帮助我。该项目必须以可在任何计算机上运行的可执行文件的形式提交。我想我应该寻找的解决方案是静态编译,它将所有库静态链接到可执行文件。我尝试在 Cmake 中添加一些像下面这样的标志:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread")

但它没有任何帮助。我对 CMake 的工作原理一无所知,如果能提供任何帮助,我将不胜感激。

我目前拥有的整个 cmake 文件:

cmake_minimum_required(VERSION 3.9)
project(Lab3)
set(EXECUTABLE_NAME "Indexer")


set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -Wextra -DWX_PRECOMP")

# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

find_package(wxWidgets COMPONENTS core base REQUIRED)

include(${wxWidgets_USE_FILE})
include_directories(include/ ${wxWidgets_INCLUDE_DIRS})

file(GLOB SOURCES "src/*.cpp")
add_executable(${PROJECT_NAME} main.cpp Source.cpp Source.h)

target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES})

编辑:我想我没有足够清楚地说明问题。该程序编译良好 - 一切正常。只是每当我尝试将可执行文件(最终应用程序)复制到另一台计算机时,它就无法正常工作或显示为带有损坏字符的文本文件,而不是带有 GUI 等的应用程序。

【问题讨论】:

  • 如果您在静态编译wxWidgets时遇到问题,为什么要显示您的代码?如果您在使用 wxWidgets 时遇到问题,请描述此问题(可能是错误消息,或类似的)。
  • @Tsyvarev,它编译得很好——一切正常。只是每当我尝试将可执行文件(应用程序)复制到另一台计算机时,它就不起作用或显示为带有损坏字符的文本文件。如果我从一开始就不清楚,请原谅。
  • shows up as a text file with corrupted characters. - 您是否尝试在 Windows 上运行可执行文件,而它是为 Mac 构建的? “只是不起作用” - 它在运行时是否显示一些错误消息,还是什么?这个问题对我来说仍然不清楚。
  • 好的,所以... Clion 可以很好地编译我的程序。它创建一个“Unix Executable”类型的可执行文件。它位于我的项目目录中。当我单击它(在我的 Mac 上)时,它会调用终端,然后在应用程序本身启动后立即调用。我尝试将可执行文件复制到我兄弟的 macbook 上,但它在那里不起作用。在不同的 mac 上启动它就像我打开一个 .txt 文件一样。可执行文件只有 198KB,所以我想是不对的。
  • 如何在两台计算机之间传输文件?你说它应该“在任何计算机上工作”;如果通过“任何计算机”您还希望它在 Windows 和 Linux 上工作,这是不可行的(并且可能完全不可能)。一般来说,可执行文件只能在编译它们的系统上工作,而无需进行某种模拟或翻译。

标签: c++ cmake wxwidgets clion


【解决方案1】:

你没有复制正确的东西。您认为的应用程序可能只是某种启动器。

Mac GUI 应用程序不只包含一个文件。你的Indexer 应用实际上就是Apple 所说的bundle。 Finder 将其作为单个实体呈现给用户,但它实际上是一个文件夹。

您可以通过右键单击捆绑包(或 Ctrl+单击)并选择显示包内容来查看捆绑包的内部。如果您想进一步了解其中的内容,Apple 会将其记录在 here

从 A 到 B 获取捆绑包的一个好方法可能是将其压缩。完成此操作后,您会发现静态链接它的努力是否成功。我知道的是你的构建系统把它放在哪里,但也许this post 会有所帮助。它将被称为 Indexer.app,也许Spotlight 可以找到它。

【讨论】:

  • 确实如此。然而,他似乎使用自制软件,默认情况下安装动态库作为任何其他包管理器默认安装。所以真正的问题是构建一个静态链接 wxWidgets,然后将应用程序重新构建为一个包。
  • 嗯,好的,所以有两个问题。认为可能有。
【解决方案2】:

要构建具有尽可能少的依赖关系的 wxWidgets,您应该不仅使用--disable-shared 配置它,还应该使用--disable-sys-libs 来配置它,以防止它使用任何第三方库(例如 libz、libpng、...)可能已安装在您的系统上。

使用 wxWidgets 构建应用程序后,您应该确认 otool -L YourApp.app/Contents/MacOS/YourApp 没有显示任何非系统库。

【讨论】:

  • 感谢您的帮助。 “配置它”到底是什么意思?我应该配置 wxWidgets 本身吗?还是我应该将这些标志添加到 cmake 中?我在 /wxmac/bin 文件夹中找到了一个 wx-config 文件。我猜这可能是实际的配置文件?如果那是我正在寻找的实际文件,我应该在哪里添加这些标志?
  • 这些选项应该在运行 wxWidgets 配置脚本时使用,例如$wx/configure --disable-shared --disable-sys-libs。您必须自己构建 wxWidgets,如果它已经构建了引用某些特定于您系统的库,那么您对这些依赖项无能为力,您必须将它们与您的应用程序一起分发(这在 Mac 下相对简单,因为您可以只需将它们放入您的捆绑包中)。
猜你喜欢
  • 2015-08-31
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多