使用Ninja生成器与LLVM编译器时CMake库路径配置及链接问题
问题:CMake+Ninja+Clang构建C++项目时链接oldnames.lib/msvcrtd.lib失败
核心需求:使用CMake搭配Ninja生成器,基于LLVM Clang编译器构建C++项目,需要链接oldnames.lib和msvcrtd.lib两个库。
问题现象:目标库实际存在,但CMake测试编译器阶段,lld-link报错找不到这两个文件。不过CMake本身能通过find_library成功定位到它们:
# Find the required libraries find_library(OLDNAMES_LIB oldnames.lib) find_library(MSVCRD_LIB msvcrtd.lib) if (NOT OLDNAMES_LIB) message(FATAL_ERROR "Failed to find oldnames.lib") endif() if (NOT MSVCRD_LIB) message(FATAL_ERROR "Failed to find msvcrtd.lib") endif()
尝试过的无效方案
我尝试了多种方式传递链接器标志,但CMake输出显示这些标志并未传递给C编译器:
- 使用
target_link_libraries直接链接库:
target_link_libraries(sound_sculptor_test PRIVATE "${MSVCRD_LIB}" "${OLDNAMES_LIB}")
- 使用
target_link_options指定库路径:
target_link_options(sound_sculptor_test PRIVATE "-L\"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/lib/onecore/x64/\"")
- 设置全局链接器标志:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OLDNAMES_LIB} ${MSVCRD_LIB}") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OLDNAMES_LIB} ${MSVCRD_LIB}")
此外,我还将CFLAGS和CXXFLAGS设置为包含对应库路径,但问题依旧。
环境版本
- CMake 3.26.4
- Make 4.4.1
- Ninja 1.11.1
- LLVM 16.0.6
解决办法
只需在设置CFLAGS环境变量后,删除CMake生成的CMakeCache.txt文件,重新运行CMake配置即可解决问题。
内容的提问来源于stack exchange,提问作者John Glen
相关产品推荐
相关产品推荐

