jjzjj

windows - CMake Imported Library Target 在 Windows 上提供未定义的 undefined symbol

coder 2024-06-11 原文

我正在尝试将 libuv 导入到我的 CMake 项目中,以便我可以链接它。我从 here 安装了 libuv 1.12.0我把它放在 C:\Program Files\libuv\ 中。

project(tls-server LANGUAGES C)
set(LIBUV_ROOT_DIR "C:\\Program Files\\libuv")
add_library(libuv SHARED IMPORTED)
set_property(TARGET libuv PROPERTY IMPORTED_LOCATION "${LIBUV_ROOT_DIR}\\libuv.dll")
set_property(TARGET libuv PROPERTY IMPORTED_IMPLIB "${LIBUV_ROOT_DIR}\\libuv.lib")
add_executable(tls-server "${CMAKE_SOURCE_DIR}/src/main.c")
target_link_libraries(tls-server libuv)

但是,鉴于上面的代码,我在 Visual Studio 中仍然遇到 undefined symbol 错误:

我该如何解决这个问题?我相信路径都是正确的。我也在使用 Windows 10。

最佳答案

切勿在 CMake 中像这样硬编码库路径或名称。

改为使用 find_library命令,如果提供的库有问题,它会尽早通知您。

特别是在 Windows 上,由于系统上没有库所在的默认位置(类似于 *nix 系统上的 /usr/local/lib),您可能需要提供一个图书馆位置的额外定制点。我个人喜欢为此使用环境变量,但普通的 CMake 选项也可以:

project(tls-server LANGUAGES C)

find_library(LIBUV_LIBRARIES NAMES uv libuv 
     HINTS $ENV{LIBUV_ROOT})

add_executable(tls-server ${PROJECT_SOURCE_DIR}/src/main.c)
target_link_libraries(tls-server ${LIBUV_LIBRARIES})

请注意,CMake 通常不会将运行时依赖项复制到正确的位置!也就是说,如果 libuv 是作为 .dll 构建的,您必须确保 .dll 在运行程序时位于正确的路径中。

当然,您可以在 CMake 中手动插入一个复制命令,以将所有 dll 放置到位,但这可能非常麻烦。不幸的是,目前没有更舒适的解决方案来解决这个问题。

在这里使用导入的目标是可能的,但只有在您需要将更复杂的属性传递给依赖目标时才真正有返回。根据我的经验,如果依赖项提供 fully-fledged package config file,导入的目标效果最好.就额外的复杂性而言,手动编写导入的目标通常是不值得的。

关于windows - CMake Imported Library Target 在 Windows 上提供未定义的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44507771/

有关windows - CMake Imported Library Target 在 Windows 上提供未定义的 undefined symbol的更多相关文章

随机推荐