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

How do I link to a static library (libtiff) using CMake in my wxWidgets project?

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

当我编写 Makefile 时,我 运行 遇到了 libtiff 问题。我想静态 link 我的应用程序,这样我就不必自己分发任何 dylib 或依赖我的用户来安装它们。我将 wxWidgets 构建为静态库,但是当我编译我的代码并使用 otool 检查我的二进制文件时,我总是发现我的二进制文件需要本地 dylib。

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

终于找到了解决办法on here。实际上,在我的 Makefile 的 linking 行中,我用 LDFLAGS 替换了 wx-config –-libsLDFLAGS 看起来像这样:

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,但似乎也删除了分隔不同库的分号和空格。

我一直在网上搜索有关如何操作的任何线索,但我似乎对库的了解不够好,无法解决此问题。

如有任何帮助,我们将不胜感激。

我的 search-and-replace 想法原来还不错。我能够使用 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}")

因此,为了解决我的实际问题,我在 target_link_libraries() 命令之前调用此 string() 命令。

调用find_package(wxWidgets)前设置wxWidgets_USE_STATIC=ON。请在此处查看 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)