使用Conan构建nlohmann_json_schema_validator示例时遇链接错误的技术求助
解决Conan + CMake链接
nlohmann_json_schema_validator失败的问题 我之前踩过Conan和CMake集成的类似坑,给你几个可行的解决方案,应该能帮你解决问题:
方案1:修复旧版conan_cmake_run的用法
你最初用的conan_cmake_run是Conan 1.x的旧函数,问题出在BASIC_SETUP默认不会生成CMake目标,而是用${CONAN_LIBS}变量传递依赖,这种方式很容易因为路径或变量传递遗漏出错。修改成目标式的链接方式会更可靠:
cmake_minimum_required(VERSION 3.10) project(app VERSION 1.0.0 LANGUAGES CXX) add_executable(${PROJECT_NAME} src/main.cpp) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake") message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan") file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/master/conan.cmake" "${CMAKE_BINARY_DIR}/conan.cmake") endif() include(${CMAKE_BINARY_DIR}/conan.cmake) # 关键修改:添加TARGETS参数,让Conan生成CMake目标 conan_cmake_run(REQUIRES json-schema-validator/2.1.0 BASIC_SETUP TARGETS BUILD missing) # 改用Conan生成的目标链接,自动处理头文件和库路径 target_link_libraries(${PROJECT_NAME} CONAN_PKG::json-schema-validator) target_include_directories(${PROJECT_NAME} PUBLIC "src")
这种方式下,CONAN_PKG::json-schema-validator会自动包含依赖的nlohmann_json,不需要额外处理头文件或库路径。
方案2:改用Conan 2.x推荐的现代集成方式
如果你的Conan版本是2.x,更推荐用CMakeDeps和CMakeToolchain生成器,这是官方现在主推的可靠集成方式:
步骤1:创建conanfile.txt(项目根目录)
[requires] json-schema-validator/2.1.0 [generators] CMakeDeps CMakeToolchain
步骤2:修改CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(app VERSION 1.0.0 LANGUAGES CXX) # 引入Conan生成的工具链文件(必须在project之后,find_package之前) set(CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/conan_toolchain.cmake CACHE PATH "Conan toolchain file") # 用CMake原生的find_package找到依赖 find_package(json-schema-validator REQUIRED) add_executable(${PROJECT_NAME} src/main.cpp) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) # 链接官方定义的目标 target_link_libraries(${PROJECT_NAME} nlohmann_json_schema_validator::nlohmann_json_schema_validator) target_include_directories(${PROJECT_NAME} PUBLIC "src")
步骤3:构建命令
先在项目根目录运行Conan安装依赖:
conan install . --output-folder=build --build=missing
然后进入build目录运行CMake:
cd build cmake .. make
这种方式完全遵循CMake的原生逻辑,Conan会自动生成所有依赖的配置文件,CMake能精准找到头文件和库文件,几乎不会出路径问题。
额外排查点
- 检查Conan Profile配置:确保你的Profile设置的编译器、库类型(静态/动态)和项目一致。如果要强制静态库,可以在
conan install时添加参数:conan install . -s build_type=Release -s compiler=gcc -s compiler.version=11 -s compiler.libcxx=libstdc++11 -s os=Linux -o json-schema-validator:shared=False --build=missing - 验证Conan包完整性:运行
conan list json-schema-validator/2.1.0:*确认包已正确安装,进入包目录(~/.conan/data/json-schema-validator/2.1.0/_/_/package/xxx/)检查lib和include文件夹是否有内容。
内容的提问来源于stack exchange,提问作者mscherer
相关产品推荐
相关产品推荐

