对于我的 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
,但似乎也删除了分隔不同库的分号和空格。
我一直在网上搜索任何有关该怎么做的线索,但我似乎对库没有足够的了解来解决这个问题。
任何帮助将不胜感激。
在调用
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)
我的搜索和替换想法结果并没有那么糟糕。我能够使用 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。