如何在我的 wxWidgets 项目中使用 CMake 链接到静态库 (libtiff)?

问题描述 投票:0回答:2

对于我的 wxWidgets 项目,我正在尝试从我自己编写的 Makefile 切换到 Cmake。我在 macOS 上开发。

当我编写 Makefile 时,我遇到了 libtiff 的问题。我想静态链接我的应用程序,这样我就不必自己分发任何 dylib 或依赖我的用户来安装它们。我将 wxWidgets 构建为静态库,但是当我编译代码并使用

otool
检查我的二进制文件时,我总是发现我的二进制文件需要本地 dylib。

/usr/local/opt/libtiff/lib/libtiff.5.dylib

终于我找到了解决方案在这里。本质上,在我的 Makefile 的链接行中,我将

wx-config –-libs
替换为
LDFLAGS
LDFLAGS
看起来像这样:

WXCONFIGLIBS := $(shell wx-config --libs)
WXCONFIGLIBS := $(WXCONFIGLIBS:-ltiff=/usr/local/opt/libtiff//lib/libtiff.a)
# I am not sure whether the double slash is a typo but it works so I don't change it
LDFLAGS := $(WXCONFIGLIBS)

基本上,我用静态 libtiff 库的路径搜索并替换

-ltiff

现在我已经成功使用 Cmake 编译了我的项目。但是,我收到了与解决最初问题时相同的警告消息。

ld: warning: dylib (/usr/local/lib/libtiff.dylib) was built for newer macOS version (11.0) than being linked (10.11)

我该如何解决这个问题?我的 CMakeLists 包含与 wxWidgets 有关的以下部分:

find_package(wxWidgets REQUIRED gl core base OPTIONAL_COMPONENTS net)
include(${wxWidgets_USE_FILE})
...
add_executable(myapp ${SOURCES})
target_link_libraries(myapp ${wxWidgets_LIBRARIES})
set_property(TARGET myapp PROPERTY CXX_STANDARD 17)

我已经尝试过运行一些搜索和替换恶作剧,例如

string(REPLACE "-ltiff" "/usr/local/opt/libtiff/lib/libtiff.a" wxWidgets_LIBRARIES ${wxWidgets_LIBRARIES})

但这行不通。它确实取代了

-ltiff
,但似乎也删除了分隔不同库的分号和空格。

我一直在网上搜索任何有关该怎么做的线索,但我似乎对库没有足够的了解来解决这个问题。

任何帮助将不胜感激。

c++ cmake makefile static-libraries wxwidgets
2个回答
0
投票

在调用

wxWidgets_USE_STATIC=ON
之前设置
find_package(wxWidgets)
。请参阅此处
wxWidgets
的文档:https://cmake.org/cmake/help/latest/module/FindwxWidgets.html

option(wxWidgets_USE_STATIC "Link to wxWidgets statically" ON)

find_package(wxWidgets REQUIRED gl core base OPTIONAL_COMPONENTS net)
include(${wxWidgets_USE_FILE})
...
add_executable(myapp ${SOURCES})
target_link_libraries(myapp PRIVATE ${wxWidgets_LIBRARIES})
target_compile_features(myapp PRIVATE cxx_std_17)

-1
投票

我的搜索和替换想法结果并没有那么糟糕。我能够使用 Cmake 实现与 Makefile 相同的结果。

我的问题是没有在适当的地方使用双引号。所以代替这个:

string(REPLACE "-ltiff" "/usr/local/opt/libtiff/lib/libtiff.a" wxWidgets_LIBRARIES ${wxWidgets_LIBRARIES})

我只需要写:

string(REPLACE "-ltiff" "/usr/local/opt/libtiff/lib/libtiff.a" wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")

因此,为了解决我的实际问题,我在

string()
命令之前调用此
target_link_libraries()
命令。


2024 年更新:

在我原来的解决方案停止工作后,我回到这个问题并终于找到了正确的解决方案。该解决方案来自 wxWidgets 网站上的这篇 2014 年博客文章

这是相关引用:

[...]有时您可能想避免使用系统库,例如因为您希望构建具有尽可能少的依赖项的程序的静态链接版本。这总是可以通过使用 -with-libfoo=builtin 显式禁用每个库来实现,但这相对烦人,而且很容易忘记一两个库。

为了解决这个问题,我刚刚添加了一个新的 --disable-sys-libs 配置选项,它的作用与它所说的完全一样:当在配置命令行上指定它时,只有第三方库的内置版本才会被使用。使用过。

所以解决方案就是在配置wxWidgets时使用选项

--disable-sys-libs
。不再依赖本地 dylib。

© www.soinside.com 2019 - 2024. All rights reserved.