4

我正在尝试使用 CMake 链接 Windows 上的共享库。这个共享库是用 Clang 编译的,因此我必须使用 GNU ld 才能正确传播调试符号(因为 Microsoft link.exe 对 GNU 样式的调试符号一无所知)。我的共享库依赖于kernel32.dll和的导入库msvcrt.dll。我将 GNU 风格的导入库作为 w32api 安装的一部分。

但是,当我在调用中指定导入库名称时target_link_libraries(),名称会被破坏,因此会target_link_libraries(${my_target} kernel32)出现-lkernel32.lib在命令行上。但是,kernel32 导入库的名称是libkernel32.a, not libkernel32.lib.a,因此链接失败。我怀疑这是因为我的 Clang 副本默认使用 Microsoft link.exe,并且我设置CMAKE_CXX_CREATE_SHARED_LIBRARY为覆盖此行为。如果是这种情况,我很可能不得不重新编译 Clang(并希望我不会在新副本中得到相同的行为)。

编辑:Clang 没有错。我从头开始重建 Clang,却发现.lib后缀仍然是自动添加的。我知道现在是 CMake 的错。我究竟做错了什么?

4

1 回答 1

3

您可以尝试修改CMAKE_LINK_LIBRARY_SUFFIX变量:

unset(CMAKE_LINK_LIBRARY_SUFFIX)
target_link_libraries(${my_target} kernel32)
于 2013-04-28T17:17:54.843 回答